cron 式は次にいつ動く?日本時間で調べる
次の 10 回の実行
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
|---|---|---|---|---|---|---|
| 1 | 2実行する日 | 3文化の日・実行する日・祝日に当たる実行 | 4実行する日 | 5実行する日 | 6実行する日 | 7 |
| 8 | 9実行する日 | 10実行する日 | 11実行する日 | 12実行する日 | 13実行する日 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23勤労感謝の日 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 |
- 土日・祝日
- 実行する日
- 祝日に当たる実行
入れた式で動く、いまから先の 10 回です。日本時間の列は、いまの年と違う年の行にだけ年を付けています。UTC で書くときの時刻は、上の答えの「UTC で書くと次の実行は」に出ています(日本時間から 9 時間引きます)。祝日の列は、その日が日本の祝日のときの名前です。
| 日本時間 | 祝日 |
|---|---|
| 11/2(月)9:00 | — |
| 11/3(火)9:00 | 文化の日 |
| 11/4(水)9:00 | — |
| 11/5(木)9:00 | — |
| 11/6(金)9:00 | — |
| 11/9(月)9:00 | — |
| 11/10(火)9:00 | — |
| 11/11(水)9:00 | — |
| 11/12(木)9:00 | — |
| 11/13(金)9:00 | — |
数え方と結果の読み方
計算の仕方
次の実行=いまより後で、分・時・日・月・曜日の 5 つの欄が全部当てはまる、いちばん早い時刻
- 分 時 日 月 曜日の 5 つの欄を、それぞれ「動く値の集まり」に直します(* は全部、1-5 は 1 から 5、*/15 は 15 ごと、, は並べる)。
- 日と曜日の両方を指定したときは、どちらか一方に当たる日が動く日になります(OR)。どちらかが * から始まるときは、両方に当たる日だけです。
- いまの時刻(日本時間)から 1 日ずつ進み、月と日が当たる日の中で、時と分の組み合わせを早い順に拾います。
- 拾った 10 回の日付を内閣府の「国民の祝日」と照らし、祝日に当たる回に印を付けます。
結果の読み方と使いどころ
図の月の格子は、次の 10 回の実行日を含む月を並べ、実行する日に ●、祝日に当たる実行に × の印を付けています。答えの「UTC で書くと次の実行は」は、UTC で動くサーバーに同じ時刻で動かしたいときに書く時刻です(日本時間から 9 時間引きます)。
日本時間の 9 時 0 分は、UTC の 0 時 0 分です。日本時間の 0〜8 時台に動かしたいときは、UTC では前の日の 15〜23 時台になるので、日と曜日の欄もずらします。
cron の式だけでは、祝日を外すことはできません。祝日に動かしたくない処理は、× の印が付いた日を目安に、スクリプトの先頭で日本の祝日かどうかを判定して終了させます。
よく使う cron 式の早見
分 時 日 月 曜日の順です。意味は、この道具が式から読み取った言葉です。曜日の 0 と 7 はどちらも日曜です。
| 式 | 意味 |
|---|---|
| * * * * * | 毎分 |
| 0 * * * * | 毎時 0 分(1 時間ごと) |
| */15 * * * * | 15 分ごと |
| 0 9 * * * | 毎日 9 時 0 分 |
| 0 9 * * 1-5 | 平日の 9 時 0 分 |
| 0 9 * * 1 | 毎週月曜の 9 時 0 分 |
| 0 0 1 * * | 毎月 1 日の 0 時 0 分 |
| 0 0 1 1,4,7,10 * | 1・4・7・10 月 1 日の 0 時 0 分(四半期の初日) |
| 0 0 1 1 * | 1 月 1 日の 0 時 0 分(毎年の元日) |
| 30 8 * * 6,7 | 土日の 8 時 30 分 |
| 0 9-17 * * 1-5 | 平日の 9〜17 時の 0 分 |
標準の cron では書けない条件
どれも、スクリプトの側で条件を判定して止める書き方です。
| やりたいこと | 書き方 |
|---|---|
| 毎月の最終日 | 毎日動かして、スクリプトで「明日が 1 日か」を判定 |
| 祝日を除く | 平日(1-5)で動かして、スクリプトで祝日なら終了 |
| 第 2 月曜など | 曜日だけで動かして、スクリプトで日を判定 |
| 日本時間で動かす | CRON_TZ=Asia/Tokyo か、UTC に直して書く |
- 毎月の最終日: 式だけでは書けません。日を 28-31 にして、先頭で判定します。例: 0 0 28-31 * * [ "$(date -d tomorrow +\%d)" = "01" ] && /path/to/job
- 祝日を除く: 式だけでは外せません。祝日の日付は、上の表の祝日の列や、内閣府の「国民の祝日」の一覧から取れます。
- 第 2 月曜など: 日と曜日を両方書くと OR になり、毎週の月曜と 8〜14 日の両方で動いてしまいます。
- 日本時間で動かす: 式の上の行に CRON_TZ=Asia/Tokyo と書くと日本時間で動く cron もあります(使えない環境もあります)。日本時間の 9 時は UTC の 0 時で、日本時間の 0〜8 時台は UTC では前の日になります。
よくある間違い
日と曜日を両方書くと「かつ」になると思う
日と曜日の両方に * 以外を書くと、どちらか一方に当たる日に動きます(Vixie cron の決まり)。「毎月 1 日で、しかも月曜」だけ動かすことはできないので、曜日だけで動かしてスクリプトで日を判定します。
UTC のサーバーなのに、日本時間の時刻を書く
cron はサーバーの時刻で動きます。UTC のサーバーなら、日本時間の 9 時は 0 時と書きます。クラウドの定期実行の多くは UTC が基準です。
祝日は自動で除かれると思う
cron に祝日の知識はありません。祝日に動かしたくない処理は、スクリプトの先頭で判定します。
日を 29〜31 と書いて、毎月動くと思う
29〜31 日は、その日が無い月には動きません。「0 0 28-31 * *」は、2 月は 28 日(うるう年は 29 日)までの日だけ動きます。
毎月の最終日を 31 と書く
日に 31 と書くと、30 日までの月では動きません。毎月の最終日は式では書けないので、上の表の方法で判定します。
よくある質問
秒つきの式や @daily は使えますか?
この道具は、分・時・日・月・曜日の 5 つの欄の式だけに対応します。秒つきの式、@daily などの省略形、L・W・# を使う書き方(Quartz など)は数えません。
入れた式はどこかに送られますか?
計算はこの端末のブラウザの中だけで行い、式はどこにも送りません。祝日の表はページと一緒に読み込んでいます。「Google カレンダーに入れる」を押したときだけ、予定の題と日付が Google に送られます。
何年先まで数えますか?
今年から数えて 5 年目の年末までです。2月30日のように無い日だけを指定した式は、動く日が見つからないと知らせます。