cron 式の作成・解説ツール

cron 式を作成したり、わかりやすい言葉で読み解いたりできます。

このツールについて

ジョブを実行する頻度を選んで cron 式を作成するか、式を入力すると、わかりやすい説明、各フィールドの内訳、あなたのタイムゾーンでの次回以降の実行時刻が表示されます。範囲、リスト、ステップ、月名や曜日名、@daily などのショートカットに対応しています。

使い方

  1. 式を読み解くには、「解説」モードで貼り付けると、わかりやすい言葉で説明が表示されます。
  2. 作成するには、「作成」モードに切り替えて、ジョブを実行する頻度を選びます。
  3. 次回の実行時刻を、あなたのタイムゾーンで確認します。
  4. 式を crontab、CI の設定、スケジューラーにコピーします。

よくある質問

5 つのフィールドは何を意味しますか?
順に、分(0〜59)、時(0〜23)、日(1〜31)、月(1〜12)、曜日(0〜6、日曜日は 0 または 7)です。* はすべての値を意味します。
5 分ごとにジョブを実行するには?
*/5 * * * * を使います。/5 はステップで、そのフィールドの値を 0 から数えて 5 つおきに、という意味です。
日と曜日の両方を指定するとどうなりますか?
従来の cron では、どちらか一方が一致したときにジョブが実行されます(両方ではありません)。そのため 0 9 1 * MON は、毎月 1 日と毎週月曜日の 9:00 に実行されます。
cron はどのタイムゾーンを使いますか?
実行するマシンやサービスのタイムゾーンです。サーバーや CI では UTC であることがよくあります。ここに表示される次回以降の実行時刻はローカル時刻なので、サーバーが UTC を使っている場合は換算してください。
cron ジョブを 30 秒ごとに実行するには?
cron ではできません。最小単位が 1 分だからです。よくある回避策は 2 つのエントリーを使う方法で、一方はコマンドを実行し、もう一方は sleep 30 の後にコマンドを実行します。それより正確な実行や高頻度の実行が必要なら、systemd タイマーか、独自のループを持つ常駐プロセスを使ってください。
月末日にジョブを実行するには?
標準の cron には L がありません。0 23 28-31 * * のように 28〜31 日にジョブをスケジュールし、コマンドの先頭で翌日が 1 日かどうかを確認します。例えば [ $(date -d tomorrow +\%d) = 01 ] && your-command のようにします。これには GNU date が必要です。
crontab の @reboot とは?
@reboot は、cron デーモンの起動時、通常はマシンの起動直後にコマンドを 1 回実行します。cronie や Vixie cron でサポートされていますが、時刻によるスケジュールではないため、このツールでは今後の実行を表示できず、エラーを報告します。systemd のマシンでは、サービスユニットのほうが適していることが多いです。

cron ジョブが実行されないのはなぜですか?

まず、cron がそもそもジョブを認識しているか確認します。同じユーザーで crontab -l を実行し、ファイルが改行で終わっていることを確かめてください。改行のない最終行を無視する cron のバージョンがあるためです。次にスケジュールを確認します。ここに貼り付けて「今後の実行」を読んでください。よくある誤解が分のフィールドの */45 で、これは 45 分ごとではなく、毎時 :00 と :45 に実行されます。

スケジュールが正しいなら、たいていは環境が原因です。cron は最小限の PATH で、シェルのプロファイルを読み込まずに実行されるため、ターミナルでは動くコマンドが「command not found」で失敗します。絶対パスを使い、crontab の先頭で PATH を設定し、>> /tmp/job.log 2>&1 で出力をログに送ってエラーを確認できるようにしてください。また、crontab の行では % が特殊文字なので、\% とエスケープする必要があります。

cron の書式を解説: 範囲、リスト、ステップ、ショートカット

各フィールドには単一の数値以外も指定できます。9-17 のような範囲は 9 から 17 までのすべての値に、1,15 のようなリストは列挙した各値に、*/15 のようなステップはフィールドの最小値から 15 ごとの値にマッチします。これらは組み合わせられ、分のフィールドの 0-30/10 は 0、10、20、30 を意味します。月と曜日のフィールドでは、JAN や MON-FRI のような名前も使えます。

ショートカットは式全体の代わりになります。@hourly は 0 * * * *、@daily と @midnight は 0 0 * * *、@weekly は 0 0 * * 0、@monthly は 0 0 1 * *、@yearly と @annually は 0 0 1 1 * です。曜日のフィールドでは、0 と 7 のどちらも日曜日を意味します。この cron 式の解説ツールの「フィールド」の表には各フィールドがどの値に展開されるかが表示され、ややこしい組み合わせを確認する最も手早い方法です。

crontab と Kubernetes、GitHub Actions、Quartz の cron の違い

5 フィールドの書式は Linux の crontab、Kubernetes の CronJob、GitHub Actions のスケジュールで共通なので、この cron ジェネレーターで作成した式は 3 つすべてで使えます。GitHub Actions は常に UTC を使い、実行間隔は最短 5 分で、混雑時にはスケジュールされたジョブの開始が遅れることがあります。Kubernetes は、spec.timeZone を設定しない限りコントローラーのタイムゾーンを使います。いずれも秒のフィールドには対応していません。

Quartz、Spring、AWS EventBridge はより長い書式を使います。Quartz と Spring は先頭に秒のフィールドを、AWS は末尾に年のフィールドを追加します。Quartz と AWS では 2 つの日のフィールドのどちらかに ? が必要で、3 つとも月末を表す L や第 n 曜日を表す # などの拡張に対応しています。こうした式はここでは受け付けられないため、余分なフィールドを削除し、L や # は手で書き直してください。

よく使う cron 式

スケジュールをコピーするか、上のツールに貼り付けて次回の実行日時を確認できます。

式意味
* * * * *毎分
*/5 * * * *5 分ごと
*/15 * * * *15 分ごと
0 * * * *毎時
0 */6 * * *時ちょうど, 6 時間ごと
0 0 * * *次において実施00:00
30 2 * * *次において実施02:30
0 9 * * 1-5次において実施09:00、月曜日 から 金曜日 まで
0 0 * * 0次において実施00:00日曜日 にのみ
0 0 1 * *次において実施00:00、月の 1 日目
0 0 1 1 *次において実施00:00、月の 1 日目1月 でのみ

うまく動かない、または結果がおかしいですか? このツールの問題を報告