Cron式:推測なしで何でもスケジュール
あの謎めいたスケジュール文字列をついに解説。一発で動くCron式の書き方。
0 0 * * * — これは何を意味するのでしょう?
AWS Lambda、GitHub Actions、あるいは何らかのタスクスケジューラーを使ったことがあれば、Cron式を見たことがあるはずです。5つか6つの謎めいたフィールドが、どうにかしてジョブをスケジュールします。
見た目ほど複雑ではありません。
5つのフィールド
┌───────────── 分(0 - 59)
│ ┌───────────── 時(0 - 23)
│ │ ┌───────────── 日(1 - 31)
│ │ │ ┌───────────── 月(1 - 12)
│ │ │ │ ┌───────────── 曜日(0 - 6、日曜 = 0)
│ │ │ │ │
* * * * *
各フィールドはジョブが実行される時を制限します。* は「毎」を意味します。数字は「その値のみ」を意味します。
例を読み解く
0 0 * * * — 分0、時0、任意の日、任意の月、任意の曜日 = 毎日深夜0時
30 8 * * 1-5 — 午前8:30、月曜から金曜 = 平日の朝
0 */2 * * * — 2時間ごと = 午前2時、4時、6時...
0 9 1 * * — 毎月1日の午前9時 = 月次レポート時間
特殊文字
* — すべての値(毎分、毎時など)
, — 複数の値。1,15 は1日と15日を意味します。
- — 範囲。1-5 は1から5を意味します。
/ — ステップ。*/15 は15ごとを意味します。分フィールドの */15 = 15分ごと。
よくあるパターン
5分ごと: */5 * * * *
毎時30分: 30 * * * *
毎日午前3時: 0 3 * * *
毎週日曜深夜0時: 0 0 * * 0
毎月1日の午前9時: 0 9 1 * *
平日午後6時: 0 18 * * 1-5
落とし穴
曜日 vs 日付。 両方を設定すると、ほとんどのシステムはOR結合します。0 0 1 * 1 は1日と毎週月曜の両方で実行されます。1日で月曜の時だけではありません。
タイムゾーンが重要。 ほとんどのCronシステムはサーバー時刻かUTCを使います。どちらを扱っているか把握しましょう。
6フィールド vs 5フィールド。 一部のシステムは最初に秒フィールドを追加します。0 0 0 * * * は秒フィールドありで深夜0時になります。
日曜 = 0 または 7。 システムによります。通常、日曜には両方とも機能します。
デプロイ前のテスト
0 0 */2 * * が2日ごとなのか2時間ごとなのか推測しないでください。Cronパーサーを使いましょう。
いくつかの予想されるトリガー時刻を確認します。意図と一致することを確認しましょう。
重要なジョブには、モニタリングを設定しましょう。Cron式が1フィールドずれていると、日次ジョブが毎時実行されたり——あるいは毎時ジョブが毎年実行されたりします。
Cronの代替
英語構文。 一部のスケジューラーは 0 15 * * * の代わりに「every day at 3pm」を受け付けます。明確ですが移植性は低いです。
Rate式。 AWSはCron式と並んで rate(5 minutes) を使います。シンプルな間隔には簡単です。
Systemdタイマー。 Cronの代わりとなるLinux版で、ログと依存関係管理が改善されています。
Cron式は密集していますが学習可能です。5つのフィールド、それぞれがジョブの実行時を制限します。式をテストし、タイムゾーンに注意すれば、何でも確実にスケジュールできます。