📔

crontabチートシート

2022/08/03に公開

基本編

記法
分 時 日 月 曜日 コマンド
* * * * * command

毎時i分

{0}\leq{i}\leq{59}

i * * * * command

毎日H時0分

{0}\leq{H}\leq{23}

0 H * * * command

毎月d日0時0分

{1}\leq{d}\leq{31}

0 0 d * * command

毎年M月1日0時0分

{1}\leq{M}\leq{12}

0 0 1 M * command

毎週D曜日0時0分

{0}\leq{D}\leq{7}

D 0, 7 1 2 3 4 5 6
曜日
0 0 * * D command

複数回

5分と15分と45分

複数条件は,(カンマ)で区切る

5,15,45 * * * * command

15分毎

この場合0,15,30,45分に実行

*/15 * * * * command

範囲指定

0~10分の範囲で毎分実行

0-10 * * * * command

範囲指定と繰り返し

30~45分の間で5分おきに繰り返し

30-45/5 * * * * command

応用編

曜日と日付の同時指定

13日の金曜日0時0分

こうしたいところですが、、

0 0 13 * 5 command

これだと13日もしくは金曜日の0時0分という意味になってしまいます。
正解は

0 0 13 * * /usr/bin/test $(date +\%w) -eq 5 && command

日付指定だけしてあげて、あとはシェルで曜日判定をします。逆にcronで曜日を指定してあげて、シェルで日付の判定をしても大丈夫です。本記事でシェルスクリプトに関しては詳しく触れません。

月末

月によって月末の日付が異なるのが厄介です。

0 0 28-31 * * /usr/bin/test $(date -d '+1 day' +\%d) -eq 1 && command

最終D曜日

もう一度貼っておきます。
{0}\leq{D}\leq{7}

D 0, 7 1 2 3 4 5 6
曜日

その月の最終曜日の1週間後(7日後)は月が変わっているはず。

0 0 * * D /usr/bin/test $(date '+\%m') -ne $(date -d '+7 day' '+\%m') && command

第N週目のD曜日

範囲指定とシェルスクリプトによる曜日判定を組み合わせます。

N 1 2 3 4 5
Range 1-7 8-14 15-21 22-28 29-31
0 0 Range * * /usr/bin/test $(date +\%w) -eq D && command

あとがき

自分もよく忘れるので知識の定着と自分用のチートシート作成がてら記事にしました。ただ、特に覚える必要はないと思います。一回書いたら終わりなので、、、

Discussion