本文へスキップ
LeedyBox
支援する

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フィールドの形式で書き直してください。

解析ツールが表示する次回の実行日時は正確ですか?

選択した形式とタイムゾーンに基づいて、ブラウザで計算したものです。実装によって異なる場合があるため、ジョブを実行するシステムでスケジュールを確認してください。