cronの期間指定

cronの書き方で毎度悩む期間指定。めったに触らないから調べても忘れる。

ということでメモ。

基本的な記述は,「分,時,日,月,曜日」の5つのフィールドに指定したい値を書く。

cron(8) examines cron entries every minute.

The time and date fields are:

    field          allowed values
     -----          --------------
     minute         0-59
     hour           0-23
     day of month   1-31
     month          1-12 (or names, see below)
     day of week    0-7 (0 or 7 is Sunday, or use names)

毎時,毎月などは スラッシュで指定する。例えば「2時間毎に」としたいならば

* */2 * * * 

とする。それは分かる。だがしかし,これは何処を起点に2時間をカウントしはじめるのだろう,設定した時間からカウント始めるのか?それとも0時0分をスタートとして0,2,4,6,8,10,12,・・・としていくのだろうか?と毎度分からなくなる(忘れる)。ソースコードを読み解けば分かるのかもしれないが,そんな技量はないので実際に設定して確認する。

*/3 * * * * date >> /home/user/check

このときの実行状況は以下の通り。

2021年  3月 13日 土曜日 10:18:01 JST
2021年  3月 13日 土曜日 10:21:01 JST
2021年  3月 13日 土曜日 10:24:01 JST
2021年  3月 13日 土曜日 10:27:01 JST
2021年  3月 13日 土曜日 10:30:01 JST
2021年  3月 13日 土曜日 10:33:01 JST
2021年  3月 13日 土曜日 10:36:01 JST
2021年  3月 13日 土曜日 10:39:01 JST

0分からカウントされているっぽい。では41分に4分間隔に変更するとどうだろう。

*/4 * * * * date >> /home/user/check

41分からカウント開始とするなら45分に実行されるはずだが,0分スタートとするならば,44分に実行されるはず。

2021年  3月 13日 土曜日 10:39:01 JST
2021年  3月 13日 土曜日 10:44:01 JST

44分。デスヨネ。なんとなく気づいていましたよ。everyや毎にという言葉が悪い(違。

ただ,そうすると「50分毎に」や「9ヶ月毎に」など時刻ベースではなく純粋に時間間隔で実行したいときはどうするのだろう。

50 * * * *

とすると,0時50分,1時50分,2時50分と毎時50分になる。cronではそういうことは想定していないのだろうな。そもそもマニュアルに“run this command at this time on this date”ってあるしね・・・。個別にスクリプトを書くしかないのか。