fixmint
JA

cron式の読み方|フィールドごとに解説

著 · · 5分で読めます

cron式は、ジョブをいつ実行するかをスケジューラーに伝える短い文字列です。一般的な形式では、スペースで区切られた5つのフィールドを使います。分、時、日付、月、曜日の順です。0 9 * * 1-5 という行は、月曜から金曜の09:00を意味します。各フィールドは、数値、名前、リスト、範囲、ステップのいずれか、または全ての値を表す * です。すべてのフィールドが一致する時刻に、ジョブが実行されます。

cron式の解説cronの実行時刻がずれる無料で使う

5つのフィールド

フィールド指定できる値例
分0〜5930 は毎時30分
時0〜239 は09:00(24時間表記)
日付1〜3115 は15日
月1〜12、または JAN〜DEC3 または MAR は3月
曜日0〜6、または SUN〜SAT0 または 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の支援を受けて翻訳しています。

コメント

    まだコメントはありません。最初のコメントを書いてみましょう。

    評価(任意)

    メールアドレスは表示も保存もされません。

    Agentic AI in the Browserの表紙Agentic AI in the Browser

    プライバシーを重視したブラウザ内で動くAIワークフローの活用事例集です。fixmintの基盤となっている、手元のデバイスで処理するという考え方と同じものです。

    $4.99Gumroadで入手英語版