Cron式の読み方と理解方法
cron式は、繰り返しスケジュールを記述する5つまたは6つのフィールドからなる文字列です。パターンを覚えれば、任意のcron式を平易な英語のように読めるようになります。このガイドでは、単純な* * * * *から範囲、ステップ、特殊文字を含む複雑な式まで、すべてのcron構文要素の解読方法を教えます。
Cronの5つのフィールド
すべてのcron式には、コマンドに続く5つの時間フィールドがあります:
┌───────── 分 (0-59)
│ ┌──────── 時 (0-23)
│ │ ┌─────── 日 (1-31)
│ │ │ ┌────── 月 (1-12)
│ │ │ │ ┌───── 曜日 (0-7, 0と7は日曜)
│ │ │ │ │
* * * * * <command>
左から右に読みます:「何分に、何時に、月の何日に、何月に、何曜日に?」
式をステップごとに読む
単純な例
0 9 * * *
読み方:「0分、9時、毎日、毎月、毎曜日」→ 毎日午前9時に実行。
*/15 * * * *
読み方:「毎時15分ごと、毎日」→ 15分ごとに実行。
30 8 * * 1-5
読み方:「30分、8時、毎日、毎月、月曜から金曜」→ 平日の午前8時30分に実行。
0 0 1 * *
読み方:「毎月1日の深夜0時」→ 月次実行。
複雑な例
0 9-17/2 * * 1-5
分解:
0— 0分9-17/2— 9時から17時まで2時間ごと(つまり9、11、13、15、17時)*— 毎日*— 毎月1-5— 月曜から金曜
→ 平日の9:00、11:00、13:00、15:00、17:00に実行。
30 6 1,15 * 0
分解:
30— 30分6— 6時1,15— 月の1日と15日*— 毎月0— 日曜のみ
→ 月の1日と15日の午前6時30分に実行。ただし、その日が日曜の場合のみ。
特殊文字リファレンス
* — 毎/すべて
そのフィールドの任意の値にマッチします。
0 * * * * → "毎時"
* * * * * → "毎分"
, — リスト/または
複数の値を区切ります。
0 9,12,15 * * * → "午前9時、正午、午後3時"
- — 範囲
値の包括的な範囲を定義します。
0 9-17 * * * → "午前9時から午後5時まで毎時"
30 8 * * 1-5 → "平日の午前8時30分"
/ — ステップ
フィールドを増分に分割します。
*/15 * * * * → "15分ごと"
0 */2 * * * → "2時間ごと"
0 0 */3 * * → "3日ごと"
ステップは範囲と組み合わせることができます:
0 9-17/2 * * * → "午前9時から午後5時まで2時間ごと"
30 */4 * * 1-5 → "平日に4時間ごと、30分に"
L — 最終(一部のシステム)
一部のcron実装(Quartzなど)では、Lは「最終」を意味します。
0 0 L * * → "毎月最終日"
# — N番目(一部のシステム)
0 9 * * 1#1 → "毎月最初の月曜日午前9時"
一般的な式の解読
| 式 | 人間が読める形式 | 説明 |
|---|---|---|
* * * * * |
毎分 | |
*/5 * * * * |
5分ごと | |
0 * * * * |
毎時0分 | 毎時 |
0 */2 * * * |
2時間ごと | |
0 9 * * * |
毎日午前9時 | 日次 |
0 9,17 * * * |
毎日午前9時と午後5時 | |
0 9 * * 1-5 |
平日午前9時 | |
30 8 * * 1 |
月曜日午前8時30分 | |
0 0 1 * * |
毎月1日 | 月次 |
0 0 1 1 * |
1月1日午前0時 | 年次 |
*/15 9-17 * * 1-5 |
平日の営業時間中15分ごと | |
0 0 * * 0 |
毎週日曜日午前0時 | 週次 |
0 0 */2 * * |
2日ごと午前0時 | |
0 22 * * 5 |
毎週金曜日午後10時 |
6フィールドCron(秒を含む)
一部のcron実装(Quartz Schedulerなど)は6フィールドを使用し、先頭に秒を追加します:
┌───────── 秒 (0-59)
│ ┌──────── 分 (0-59)
│ │ ┌─────── 時 (0-23)
│ │ │ ┌────── 日 (1-31)
│ │ │ │ ┌───── 月 (1-12)
│ │ │ │ │ ┌──── 曜日 (0-7)
│ │ │ │ │ │
* * * * * * <command>
0 */5 * * * * → "0秒に、5分ごと"
0 0 9 * * * → "毎日午前9時00分00秒"
非標準の省略形
多くのcron実装は以下のエイリアスをサポートしています:
@yearly → 0 0 1 1 * → "年1回"
@monthly → 0 0 1 * * → "月1回"
@weekly → 0 0 * * 0 → "週1回"
@daily → 0 0 * * * → "日1回"
@hourly → 0 * * * * → "1時間に1回"
@reboot → (時間ではない) → "起動時に実行"
Cronを人間が読める形式に変換する
見慣れないcron式を見たときは、フィールドごとに解読します:
式: 45 17 1,15 * 1-5
| フィールド | 値 | 意味 |
|---|---|---|
| 分 | 45 | 45分 |
| 時 | 17 | 午後5時 |
| 日 | 1,15 | 1日と15日 |
| 月 | * | 毎月 |
| 曜日 | 1-5 | 月曜から金曜 |
結果: 「毎月1日と15日の午後5時45分、ただし平日の場合のみ」
式: 0 0 * * 0
| フィールド | 値 | 意味 |
|---|---|---|
| 分 | 0 | 0分(深夜) |
| 時 | 0 | 0時(深夜) |
| 日 | * | 毎日 |
| 月 | * | 毎月 |
| 曜日 | 0 | 日曜 |
結果: 「毎週日曜日の午前0時」
Cron読み取りの一般的な落とし穴
落とし穴1:曜日と日の両方が*の場合、両方がマッチする
日と曜日の両方が*の場合、式は任意の日に実行されます。ただし、両方に特定の値がある場合、ジョブはいずれかがマッチすれば実行されます — OR条件です。
0 9 15 * 1
これは、月の15日の午前9時と、毎週月曜日に実行されます(「15日かつ月曜日」ではありません)。両方がマッチする場合のみ実行するには、2つの別々のcrontabエントリかスクリプトレベルのロジックが必要です。
落とし穴2:Cronはローカル時間を使用し、UTCではない
Cronはシステムのローカル時間を使用します。UTCに設定されたサーバーでは、0 9 * * *はUTCの午前9時に実行されます。スケジュールを設定する前に、必ずサーバーのタイムゾーンを確認してください。
落とし穴3:0と7はどちらも日曜日
曜日フィールドでは、0と7の両方が日曜日を表します。これは初期のUnix実装からのレガシーです。
オンラインツール
Help2CodeのCron式パーサーツールは、任意のcron式を人間が読める説明にデコードします。*/15 9-17 * * 1-5のような式を貼り付けると、フィールドごとの分解、次回実行時刻、平易な英語での説明が表示されます。Cronジョブコマンドジェネレーターツールで新しい式を構築できます。
結論
cron式を読むスキルは、練習すれば自然に身につきます。5つのフィールド(分、時、日、月、曜日)を覚えてください。「毎」にはワイルドカード*、範囲には-、間隔には/、特定の値にはリストの,を使用します。見慣れない式はフィールドごとに解読し、Cron式パーサーツールを使用して理解を確認してください。