Crontab Guru

cron式を貼り付けると、それが何をするのかをフィールドごとに、わかりやすい英語で説明してくれます。フィールドの順序を覚えたり範囲を調べたりする必要はありません。グルが5つのフィールド(分、時、日、月、曜日)をひとつずつ見ていき、式を左から右に読みます。デプロイ前にcrontabの行を確認したり、引き継いだ行の意味を知ったりするのに役立ちます。

Guru の使い方

  1. 1

    式を貼り付ける

    標準の5フィールドcron式(例:`0 9 * * 1-5`)を入力欄にコピーします。

  2. 2

    説明をリクエストする

    Explain Cron をクリックすると、各フィールド(分、時、日、月、曜日)の説明が行ごとに返されます。

  3. 3

    説明を読む

    説明は英語で生成されます。例:「Minute: every 5 minutes」「Hour: from 9 through 17.」

  4. 4

    デプロイ前に確認する

    説明を使って、スケジュールが意図どおりか確認してから、crontab、CI設定、Kubernetesマニフェストに入れましょう。

フィールド早見表

 ┌───────────── 分 (0-59)
 │ ┌─────────── 時 (0-23)
 │ │ ┌───────── 日 (1-31)
 │ │ │ ┌─────── 月 (1-12 または JAN-DEC)
 │ │ │ │ ┌───── 曜日 (0-6 または SUN-SAT。日曜 = 0 または 7)
 │ │ │ │ │
 * * * * *

cron式で使える演算子

演算子 意味
* すべての値 * * * * *
, 値のリスト 0,15,30,45
- 範囲 9-17
/ ステップ(開始値/間隔) */50-30/5
L 最終(その月の最終日、または最終の該当曜日。Quartz) L5L
W 最も近い平日 15W(Quartz)
# その月のN番目の該当曜日 1#3(Quartz)
? 特定の値を指定しない Quartz のみ

読む順序が重要

0 */2 * * 1-5 は左から右に「0分、2時間ごと、日は問わず、月は問わず、月曜から金曜まで」と読みます。人は習慣でフィールドを右から左に読んでしまい、混乱しがちです。必ず「分」から読み始めましょう。

「X分ごと」の落とし穴

*/10 * * * * は0分、10分、20分、30分、40分、50分に実行されます。「ジョブを作成した時点から10分ごと」ではありません。cron のステップは常にフィールドの範囲の先頭を基準に計算されます。ジョブを 12:03 にデプロイしても、最初の実行は 12:13 ではなく 12:10 です。

「前回の実行からN分後」が本当に必要なジョブには、永続タイマーを持つスケジューラを使ってください(OnUnitActiveSec を使う systemd タイマー、または前回実行時刻を保存するアプリケーションレベルのスケジューリングなど)。

知っておきたいcronの落とし穴

  • 「日」と「曜日」の両方を指定:多くのcron実装ではOR動作になるため、おそらく意図した結果にはなりません。
  • ステップ0*/0 は無効です。
  • 範囲がまたがる場合:時間の 22-2 は従来の cron では機能しません。22-23,0-2 と書きます。
  • 2月30日0 0 30 2 * のようなスケジュールは決して実行されません。
  • 夏時間(DST)の曖昧さ:午前2時から3時の間に予定されたジョブは、DST 切り替え日に2回実行されたり、まったく実行されなかったりすることがあります。

cron と最新のスケジューラの比較

Unix の cron は今も至るところで使われていますが、重要な処理にはおそらく次のいずれかが必要になります。

  • systemd タイマー:実行漏れを検出し、ランダムなオフセットに対応し、ユニットファイルから設定を読み込みます。
  • Kubernetes CronJob:宣言的で、リトライに対応し、1.25 以降ではタイムゾーンを認識します。
  • Airflow / Prefect / Dagster:依存関係、リトライ、バックフィル、可観測性が必要なジョブ向け。
  • GitHub Actions のスケジュール:5フィールドの cron、UTC のみ、最短5分間隔、ベストエフォート配信。

cron 自体は優れた書式ですが、絶対に実行を逃せないジョブのスケジューラとしては力不足です。

よくある質問

標準の cron では曜日の 0 が日曜だからです(7 も日曜で、両方の慣習に対応しています)。月曜は 1 です。Quartz では曜日を 1〜7 で番号付けし、日曜を 1 とするため、方言(実装)を移る人がよくつまずきます。

従来の Unix の cron はサーバーのローカルタイムゾーン(/etc/timezone の内容)で動作します。Kubernetes の CronJob、GitHub Actions、ほとんどのクラウド系スケジューラは既定で UTC で動作します。必ず確認し、可能であれば UTC を使って夏時間のトラブルを避けましょう。

従来の cron ではこれを直接表現できません。回避策は、毎週月曜に実行し、スクリプト内で日付を確認することです:[ $(date +%d) -le 7 ] && ./job.sh。Quartz なら 1#1 でネイティブに対応しています。

いいえ。スケジュールごとに専用の行が必要です。ただし、リストを使って複数のスケジュールを1行にまとめることはできます。0 9,17 * * * は午前9時と午後5時に実行されます。1行で表現できないスケジュールは、同じコマンドを指す複数の行を追加してください。

関連ツール