Cron式とは何か?
CronはUnix/Linuxシステムに組み込まれた時間ベースのジョブスケジューラだ。Cron式は、cronにいつタスクを実行するかを伝える構文だ。
こんなものを見たことがあるはず:0 0 * * *。これは「毎日深夜に」を意味する。でも基礎を超えた途端に、cronの構文は複雑になる——5つのフィールド、オプションの秒フィールド、プラットフォームの違い、そしてほとんどの人が意味を理解せずにコピペする特殊文字。
このガイドでそのすべてを明確にする。
5つ(または6つ)のフィールド
標準的なcronは空白で区切られた5つのフィールドを使う:
┌──────────── 分 (0–59)
│ ┌────────── 時 (0–23)
│ │ ┌──────── 日 (1–31)
│ │ │ ┌────── 月 (1–12)
│ │ │ │ ┌──── 曜日 (0–7、0と7が日曜日)
│ │ │ │ │
* * * * *
一部のシステム(AWS EventBridge、Spring、Quartz)では先頭に秒フィールドが追加され、6フィールドになる。使用しているプラットフォームを確認しよう。
特殊文字
| 文字 | 意味 | 例 |
|---|---|---|
* | すべての値 | * * * * * = 毎分 |
, | 複数の値 | 0 9,17 * * * = 9時と17時 |
- | 範囲 | 0 9-17 * * * = 9時から17時まで毎時 |
/ | ステップ | */15 * * * * = 15分ごと |
L | 最後 | 0 0 L * * = 月末(Quartzのみ) |
? | 値なし | 0 0 ? * MON = 月曜日、月の任意の日(Quartz) |
よく使うCron式
毎分
* * * * *
5分ごと
*/5 * * * *
毎時0分
0 * * * *
毎日深夜
0 0 * * *
毎日午前9時
0 9 * * *
毎週月曜日午前9時
0 9 * * 1
平日(月〜金)午前8時
0 8 * * 1-5
週末の正午
0 12 * * 0,6
毎月1日の深夜
0 0 1 * *
四半期ごと(1、4、7、10月)の深夜
0 0 1 1,4,7,10 *
平日の9時〜17時に30分ごと
*/30 9-17 * * 1-5
よくある落とし穴
「2時間ごと」は 0 */2 * * * であり、*/2 * * * * ではない
*/2 * * * * は2分ごとという意味になる。ステップはそれが置かれているフィールドに適用される。
日曜日は0でも7でもある
標準cronでは、0と7はどちらも日曜日を表す。曖昧さを避けるために、一貫して0を使おう。
月の日 AND 曜日 はANDではなくOR
0 0 1 * 1 は毎月1日および毎週月曜日に実行される——1日が月曜日の日だけではない。「毎月第一月曜日」を実現するにはcron外のスクリプトロジックが必要だ。
タイムゾーン
Cronは特に設定しない限りサーバーのローカルタイムゾーンで動作する。UTCサーバーで0 9 * * *のジョブはUTC午前9時に実行される——これはあなたのタイムゾーンでは午前2時や午後11時かもしれない。
常に確認しよう:
timedatectl # Linuxでの現在のタイムゾーンを表示
命名されたショートカット(非標準だが広くサポートされている)
| ショートカット | 等価 | 意味 |
|---|---|---|
@yearly | 0 0 1 1 * | 年に一度 |
@monthly | 0 0 1 * * | 月に一度 |
@weekly | 0 0 * * 0 | 週に一度(日曜日) |
@daily | 0 0 * * * | 一日一度(深夜) |
@hourly | 0 * * * * | 一時間に一度 |
@reboot | — | システム起動時 |
Cron式を生成・検証する
Cron Generatorでは式をビジュアルで構築できる——日本語でスケジュールを選択し、Cron式を取得。0 9 * * 1-5が正しいかどうか迷う必要がなくなる。
逆方向も対応:任意のCron式を貼り付けると、それがいつ実行されるかの説明が得られる。
クイックリファレンス
# ┌──── 分 0-59
# │ ┌─── 時 0-23
# │ │ ┌── 日 1-31
# │ │ │ ┌─ 月 1-12
# │ │ │ │ ┌ 曜日 0-7 (0=日)
# │ │ │ │ │
* * * * * 毎分
0 * * * * 毎時
0 0 * * * 毎日深夜
0 9 * * 1 毎週月曜9時
*/15 * * * * 15分ごと
0 0 1 * * 毎月1日