次回の実行
日と曜日の扱いや夏時間など、スケジューラーによって細かな動作は異なります。本番環境で使う前に、実際のシステムでスケジュールを確認してください。
Springの @Scheduled(cron = "0 */10 * * * *") は秒から始まる6フィールドで、この例は10分ごとの0秒、1日144回実行されます。アノテーションに zone = "Asia/Tokyo" を渡せばタイムゾーンを固定でき、指定しなければサーバーの既定値が使われます。Spring 5.3以降は L・W・# も使えます。
使い方
- cron式を入力・貼り付けるか、よく使う設定をタップします。形式は項目数で判定されます:5つはUnixのcrontab、6つはSpring(先頭が秒)、7つまたは ? を含むとQuartz。
- 日本語の説明と次の10回の実行時刻を確認します。タイムゾーンを選ぶとその地域での実行時刻に切り替わり、時刻をタップするとISO 8601形式でコピーされます。
- ビジュアル編集で項目を1つずつ変更できます(毎回・間隔・指定・範囲)。
- 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や環境変数がシェルと異なる)でコマンドが動くかを確認してください。