次回の実行

日と曜日の扱いや夏時間など、スケジューラーによって細かな動作は異なります。本番環境で使う前に、実際のシステムでスケジュールを確認してください。

*/30 * * * * は毎時0分と30分、1日48回実行され、0,30 * * * * とまったく同じです。15分と45分にしたい場合は 15,45 * * * * と書きます。Quartzでは同じスケジュールを 0 0/30 * ? * * と書きます。

使い方

  1. cron式を入力・貼り付けるか、よく使う設定をタップします。形式は項目数で判定されます:5つはUnixのcrontab、6つはSpring(先頭が秒)、7つまたは ? を含むとQuartz。
  2. 日本語の説明と次の10回の実行時刻を確認します。タイムゾーンを選ぶとその地域での実行時刻に切り替わり、時刻をタップするとISO 8601形式でコピーされます。
  3. ビジュアル編集で項目を1つずつ変更できます(毎回・間隔・指定・範囲)。
  4. Unix・Quartz・Springを切り替えると、可能な範囲で式を変換します。
  • Unixのcronでは、日と曜日の両方を指定すると、どちらか一方に一致すれば実行されます(OR)。Quartzではどちらかに ? が必要で、Springでは両方に一致する必要があります。
  • Unixの曜日は0〜7(0と7が日曜)、Quartzは1〜7で1が日曜です。MON-FRIのような名前はどの形式でも使えます。
  • QuartzとSpringでは L(月末)、W(最も近い平日)、5L(最終金曜)、2#1(第1月曜)も使えます。
  • 夏時間の切り替えで存在しない時刻はスキップします。cronデーモンによって扱いが異なります。

Unix cronの5つのフィールド

標準のcrontabは5つのフィールドで書きます。分(0–59)、時(0–23)、日(1–31)、月(1–12またはJAN–DEC)、曜日(0–7、0と7が日曜、またはSUN–SAT)です。* はすべての値、カンマは列挙(1,15)、ハイフンは範囲(9-17)、スラッシュは間隔(*/15 は0・15・30・45分)を表します。

たとえば 30 2 * * 1-5 は月〜金の2時30分、0 */6 * * * は0時・6時・12時・18時に実行されます。@hourly・@daily・@weekly・@monthly はそれぞれ 0 * * * *、0 0 * * *、0 0 * * 0、0 0 1 * * の省略形です。

QuartzとSpringの違い

Quartzは先頭に秒、末尾に任意で年のフィールドを持ち、曜日は日曜を1として1〜7で数えます。また、日と曜日のどちらかに ? を書く必要があります。Spring @Scheduledは秒から始まる6フィールドで、曜日は0〜7です。どちらも L(月末)、W(最も近い平日)、6L(最終金曜日)、2#1(第1月曜日)が使えます。

よくある落とし穴

Unix cronで日と曜日の両方を指定すると、どちらか一方に合えば実行されます。0 0 13 * 5 は「13日の金曜日」だけでなく、毎月13日と毎週金曜日に動きます。cronデーモンは特に指定がなければサーバーのタイムゾーンを使い、GitHub Actionsは常にUTCです。夏時間のある地域では、切り替え日に2時30分のジョブが飛ばされたり2回動いたりすることがあるため、重要なジョブはUTCで設定すると安全です。

よくある質問

* * * * * はどういう意味ですか?

毎日、毎時、毎分実行するという意味で、1日に1,440回動きます。* はそのフィールドのすべての値を表し、順番は分・時・日・月・曜日です。

5分ごとに実行するにはどう書きますか?

*/5 * * * * と書きます。0分・5分・10分…55分に実行され、1日288回になります。開始の分をずらしたいときは、たとえば 2-59/5 * * * * のように書きます。

cronはどのタイムゾーンで動きますか?

従来のcronはサーバーのローカルタイムゾーンで動きます。CRON_TZやtimeZone設定に対応するシステムもあり、KubernetesのCronJobにはtimeZoneフィールドがあります。GitHub Actionsは常にUTCです。ここでタイムゾーンを選ぶと、その地域での実行時刻を確認できます。

Unix cronとQuartz cronの違いは?

Unix cronは分から始まる5フィールドです。Quartzは秒から始まる6〜7フィールドで、末尾に年を書けます。日曜を1と数え、日と曜日のどちらかに ? が必要です。

月末にジョブを実行するには?

QuartzとSpringでは日フィールドに L が使え、Quartzなら 0 0 0 L * ? です。標準のUnix cronには L がないため、28〜31日に実行し、翌日が1日かどうかをスクリプト側で判定する方法がよく使われます。

cronジョブが予定どおりに動かないのはなぜですか?

サーバーのタイムゾーン、日と曜日を意図せず両方指定していないか、そしてcronの最小限の環境(PATHや環境変数がシェルと異なる)でコマンドが動くかを確認してください。

一緒によく使われるツール

使い方

手順

  1. cron式を入力・貼り付けるか、よく使う設定をタップします。形式は項目数で判定されます:5つはUnixのcrontab、6つはSpring(先頭が秒)、7つまたは ? を含むとQuartz。
  2. 日本語の説明と次の10回の実行時刻を確認します。タイムゾーンを選ぶとその地域での実行時刻に切り替わり、時刻をタップするとISO 8601形式でコピーされます。
  3. ビジュアル編集で項目を1つずつ変更できます(毎回・間隔・指定・範囲)。
  4. Unix・Quartz・Springを切り替えると、可能な範囲で式を変換します。

ショートカット

Ctrl + Enter式をコピーEnterすぐに更新

知っておくと便利

ブラウザ内で動作します。ファイルや文字が端末の外に送られることはありません。