cron式の読み方|フィールドごとに解説
cron式は、ジョブをいつ実行するかをスケジューラーに伝える短い文字列です。一般的な形式では、スペースで区切られた5つのフィールドを使います。分、時、日付、月、曜日の順です。0 9 * * 1-5 という行は、月曜から金曜の09:00を意味します。各フィールドは、数値、名前、リスト、範囲、ステップのいずれか、または全ての値を表す * です。すべてのフィールドが一致する時刻に、ジョブが実行されます。
5つのフィールド
| フィールド | 指定できる値 | 例 |
|---|---|---|
| 分 | 0〜59 | 30 は毎時30分 |
| 時 | 0〜23 | 9 は09:00(24時間表記) |
| 日付 | 1〜31 | 15 は15日 |
| 月 | 1〜12、または JAN〜DEC | 3 または MAR は3月 |
| 曜日 | 0〜6、または SUN〜SAT | 0 または SUN は日曜、1 は月曜 |
一部のシステムでは 7 も日曜として使えますが、すべてではないので、0 または SUN を使ってください。この形式のcronには秒のフィールドがないため、最小のステップは1分です。
リスト・範囲・ステップ・名前
はフィールド内のすべての値を意味します。* * * *は毎分実行されます。- リスト はカンマを使います。
0 9,17 * * *は毎日09:00と17:00に実行されます。 - 範囲 はハイフンを使います。曜日フィールドの
1-5は月曜から金曜を意味します。 - ステップ はスラッシュを使います。分フィールドの
*/15は0、15、30、45を意味します。10-30/5は10、15、20、25、30を意味します。 - 名前(
MON-FRIなど)は数字の代わりに使えます。対応しているスケジューラーであれば、より読みやすくなります。
これらは組み合わせられます。0 8-18/2 * * * は、08:00から18:00まで、2時間ごとの0分に実行されます。
よくあるスケジュール
| 式 | 意味 |
|---|---|
* * * * * | 毎分 |
/15 * * * | 15分ごと |
0 * * * * | 毎時0分 |
0 2 * * * | 毎日02:00 |
0 9 * * 1-5 | 月曜から金曜の09:00 |
0 9,17 * * * | 毎日09:00と17:00 |
30 6 1 * * | 毎月1日の06:30 |
0 0 * * 0 | 毎週日曜の0時 |
0 0 1 1 * | 1月1日の0時 |
/5 9-17 * 1-5 | 月曜から金曜の09:00から17:55まで、5分ごと |
0 0 * * は深夜0時、0 12 * * は正午を意味することに注意してください。時間を間違えるのは、最もよくあるミスの一つです。
日付と曜日
日付フィールドと曜日フィールドの両方が制限されている場合、どちらかが一致すればジョブが実行されます。これは Vixie cron と、そこから派生した多くのシステムに共通する古典的なルールです。そのため 0 0 13 * 5 は、毎月13日の深夜0時に実行され、さらに毎週金曜日にも実行されます。金曜の13日だけだと思い込みがちですが、予定より多く実行されてしまうことがあります。
一方のフィールドが * の場合は、もう一方のフィールドだけが有効になります。金曜の13日だけに実行したい場合は、毎週金曜にジョブを設定し、スクリプト内で日付を確認してください。一部のクラウドサービスなど、他のスケジューラーは異なるルールを使う場合があるので、それぞれのドキュメントを確認してください。
タイムゾーンとサマータイム
cronは、実行されるマシンまたはサービスの時計で動きます。通常は、そのマシンのローカルタイムゾーンです。02:30に設定されたジョブは、その時計の02:30に実行されます。まずタイムゾーンを確認してください(Linuxでは date で表示されます)。すべての環境で同じ時計に従わせたい場合は、多くのチームがサーバーをUTCで運用しています。また、ジョブごとにタイムゾーンを設定できるスケジューラーもあります。
サマータイムは年に2回、時計を変更します。春には多くの地域で02:00から03:00へ直接進むため、02:30のジョブは実行される時刻がありません。秋には01:00から01:59までの1時間が2回現れます。スケジューラーによって扱いは異なります。実行をスキップするもの、1回だけ実行するもの、2回実行するものがあります。違いが重要な場合は、早朝の切り替え時間帯を避けるか、UTCを使ってください。
6つのフィールドとQuartz
一部のスケジューラーは、先頭に秒のフィールドを追加します。そのため /10 * * * * は10秒ごとに実行されます。Java向けのQuartzスケジューラーは、秒、分、時、日付、月、曜日、そしてオプションの年を使い、さらに4つの特殊文字を追加します。
?は「特定の値なし」を意味します。Quartzでは、日付と曜日のうち設定しない方に必ず指定する必要があります。Lは最後を意味します。日付フィールドのLは月末日、曜日フィールドの6Lは最後の金曜日です。Wは最も近い平日を意味します。15Wは15日に最も近い平日で、別の月にまたがることはありません。#は第n番目の曜日を意味します。6#3は第3金曜日です。
Quartzは日の番号を5フィールド形式とは異なる方法で数えます。1 は日曜、7 は土曜なので、月曜から金曜は 1-5 ではなく 2-6 になります。行をコピーする前に、使用しているスケジューラーがどの形式を採用しているか必ず確認してください。
よくある間違い
- 分フィールドの
*/7。値は0、7、14と続き、56まで。次は63ですが、これは存在しないので、56の次の実行は次の時の0分になります。間隔はわずか4分で、等間隔ではなくなります。5、10、15、30など、60を割り切れるステップを使ってください。 - 2月30日。 そのような日は存在しないため、
0 0 30 2 *は実行されることがありません。30日しかない月の31日も同様です。どちらか一方が一致する規則のもとでは、曜日の指定によって他の日に実行される場合もあるため、結果を確認してください。 - 時が24、または分が60。 これらは範囲外です。多くのスケジューラーは保存時に拒否しますが、すべてではありません。
- 秒を指定できると思い込むこと。 5フィールドの行は、ちょうどの分にだけ実行されます。
- cronと正規表現の混同。 cronでは
はすべての値を意味します。正規表現ではは直前の要素の繰り返しを意味します。パターンには正規表現テスターを使い、cronの行とは分けて扱ってください。
次の実行時刻を確認する
スケジュールを使う前に、その行を平易な言葉で読み直し、次の実行時刻を数回分書き出してください。cron式の解説では、その両方ができます。どちらか一方が一致する規則や、おかしなステップに気づく最も早い方法です。
よくある質問
最初のフィールドは分ですか、秒ですか?
標準の5フィールド形式では分です。秒を追加するのは一部の6フィールドのスケジューラーだけで、その場合は先頭に置かれます。
金曜日と13日の両方にジョブが実行されるのはなぜですか?
日付と曜日のフィールドが両方設定されているため、どちらか一方が一致すればジョブが実行されます。一方だけにしたい場合は、もう一方のフィールドを * にしてください。
cronはUTCを使いますか?
マシンまたはサービスがUTCに設定されている場合のみです。それ以外の場合は、そのシステムのローカルタイムゾーンを使います。
英語原文をもとに、AIの支援を受けて翻訳しています。
コメント
まだコメントはありません。最初のコメントを書いてみましょう。


