cron 式の読み方
cron 式は、空白で区切られたいくつかのフィールドで繰り返しのスケジュールを表します。考え方は単純ですが、フィールドの順序や特殊文字はシステムによって異なります。このガイドでは、よく使われる形式の読み方を説明します。
Unix の5つのフィールド
従来の Unix や Linux の cron は、左から右へ読む5つのフィールドを使います。
分(minute) 時(hour) 日(day-of-month) 月(month) 曜日(day-of-week)
つまり 30 9 * * 1-5 は「月曜日から金曜日の 09:30」という意味です。分は 0〜59、時は 0〜23、日は 1〜31、月は 1〜12 です。曜日は 0〜6 で、0 は日曜日を表します(多くの実装では日曜日として 7 も使えます)。ほとんどのバージョンでは JAN や MON のような名前や、@daily や @hourly のようなマクロも使えます。
Spring・Quartz・AWS の形式
ほかのスケジューラーはフィールドを追加しており、これがあるシステムから別のシステムへ式をコピーするときに最もよく混乱を招く原因です。
| 形式 | フィールド | 曜日 |
|---|---|---|
| Unix / Linux | 5個: 分 時 日 月 曜日 | 0–6、日曜日 = 0 |
| Spring | 6個: 秒 分 時 日 月 曜日 | 0–7、日曜日 = 0 または 7 |
| Quartz | 6個または7個: 秒 分 時 日 月 曜日 [年] | 1–7、日曜日 = 1 |
| AWS EventBridge | 6個: 分 時 日 月 曜日 年 | 1–7、日曜日 = 1 |
同じ数字でも意味が変わることがあります。0 0 12 * * ? は Quartz では「毎日正午」ですが、5フィールドとして読むと有効な式ではありません。曜日の番号もずれます。Quartz と AWS では 2 は月曜日ですが、Unix cron では火曜日です。MON のような曜日名に対応している環境では、曜日名を使えばこのあいまいさを避けられます。
特殊文字
*フィールドのすべての値。,リスト。例:1,15。-範囲。例:9-17やMON-FRI。/間隔。分フィールドの*/15は15分ごとを意味します。5/15は5から始まります(従来の Unix cron は対応しておらず、5-59/15のような範囲を使います)。?「指定なし」。Quartz と AWS では、日と曜日のどちらかのフィールドに必須です。L最後。日フィールドのLはその月の末日です。Quartz では、曜日フィールドの6Lは最終金曜日です。W最も近い平日。15Wは15日に最も近い平日です。#月の第N曜日。Quartz と AWS の番号では、6#3は第3金曜日です。
L、W、# は、従来の Unix cron が対応していない拡張です。
日と曜日の関係
日と曜日の両方のフィールドを指定した場合、それらの組み合わせ方はシステムによって異なります。従来の Unix cron では、どちらかのフィールドが一致すればジョブが実行されます。0 9 13 * 5 は、13日の金曜日だけでなく、毎月13日と毎週金曜日に実行されます。Spring では両方が一致する必要があります。Quartz と AWS は、2つのフィールドの一方に ? を必須とすることで、この問題を回避しています。
LeedyBox の Cron 解析は、選択した形式のルールを適用し、日と曜日のどちらか一方が一致すればよいのか、両方が一致する必要があるのかを概要で説明します。
タイムゾーンと夏時間
cron 式にはタイムゾーンが含まれません。式は、それを実行するシステムやサービスのタイムゾーンで実行され、それはサーバーの現地時刻の場合も UTC の場合もあります。現地時刻の 09:00 のつもりで書いたジョブでも、サーバーが UTC を使っていれば別の時刻に実行されることがあります。
夏時間(DST)は、さらに特殊なケースを生みます。時計が進められる日には 02:30 のような時刻が存在しないことがあり、戻される日には同じ時刻が2回訪れることがあります。実装によっては、その時間帯のジョブがスキップされたり、遅れて実行されたり、2回実行されたりします。重要なジョブを切り替えの時間帯以外や UTC でスケジュールすれば、予想外の動作を減らせます。Cron 解析ではタイムゾーンを選んで次回の実行日時を一覧表示できるため、切り替え前後の日付を確認できます。
よくある質問
5分ごとにジョブを実行するには?
Unix cron では */5 * * * * を使います。Spring では先頭に秒フィールドを追加して 0 */5 * * * * とします。
Quartz の式が Linux の crontab でエラーになるのはなぜですか?
Quartz の式は秒フィールドから始まり、? や L を使うことがありますが、crontab はこれらを受け付けません。5フィールドの形式で書き直してください。
解析ツールが表示する次回の実行日時は正確ですか?
選択した形式とタイムゾーンに基づいて、ブラウザで計算したものです。実装によって異なる場合があるため、ジョブを実行するシステムでスケジュールを確認してください。