手軽屋
ツール一覧

POSIX crontab 5フィールド仕様の完全ガイド

The Open Group の POSIX 仕様に基づく分・時・日・月・曜日の正確な定義と、ワイルドカード・範囲・列挙・間隔の組合せルール

1. 5フィールドの値域は仕様で固定されている

POSIX標準(The Open Group Base Specifications Issue 7, IEEE Std 1003.1)が定義するcrontabは、空白で区切られた5つのフィールドです。第1フィールドが分(minute, 0〜59)、第2フィールドが時(hour, 0〜23)、第3フィールドが月内日(day of month, 1〜31)、第4フィールドが月(month, 1〜12)、第5フィールドが曜日(day of week, 0〜6で0=日曜)。この順序は固定で、入れ替えは不可。値域も固定で、例えば分に60を書くと仕様上は不正です。実装によっては許容するものもありますが、可搬性を考えるなら値域を守るのが鉄則。本ツールはこの5フィールド仕様に厳密に従い、値域外の入力はエラーとして弾きます。

2. ワイルドカード *(アスタリスク)の意味

* は「そのフィールドが取りうる全ての値」を意味します。分に * を書けば0〜59全ての分、時に * を書けば0〜23全ての時。「* * * * *」と書くと「毎分実行」となり、これがcronで最も頻繁に発火する設定です。誤解しやすいのは、* と「指定なし」は別物という点。POSIXのcron式に「指定なし」のフィールドはなく、必ず全5フィールドを書く必要があります。「* * * * *」は「全部指定して、全部の値を許容している」状態であり、「何も書いていない」のではありません。秒つき6フィールド形式(Quartz、Spring Schedulerなど)を使うサービスでは第1フィールドが秒になりますが、POSIX標準では分が第1です。

3. 範囲 a-b と列挙 a,b,c の使い方

範囲は「a-b」と書きます。例えば曜日に「1-5」と書けば月〜金(平日)、時に「9-18」と書けば9時から18時まで。a と b は包含的で、両端の値も含みます。列挙は「a,b,c」とカンマで区切ります。曜日に「0,6」と書けば日曜と土曜(週末)、分に「0,15,30,45」と書けば15分ごとを明示的に列挙。範囲と列挙は組み合わせ可能で、「1-3,5」のように書けば1〜3と5の両方が対象。注意点として、カンマの前後にスペースを入れないこと。「1, 5」のようにスペースを入れると、フィールドの区切り(フィールド間スペース)と解釈されて誤動作します。本ツールは範囲・列挙の混合に対応し、入力時にバリデーションを行います。

4. 間隔 */n と a-b/n の使い方

間隔記法は「*/n」または「a-b/n」と書きます。分に「*/15」と書けば「0分から15分ごと」、つまり0,15,30,45分に発火。時に「*/2」と書けば「0時から2時間ごと」(0,2,4,...22)。範囲指定との組合せは「a-b/n」の形で、時に「9-18/2」と書けば「9時から18時の範囲を2時間ごと」(9,11,13,15,17時)。注意点は「*/n」が必ずしも n分ごとに均等とは限らないこと。例えば分に「*/7」と書くと「0,7,14,21,28,35,42,49,56」となり、56分の次は次の時の0分(4分後)になります。商業利用では「均等にn分ごと」を期待して「*/7」を書くと意図と外れることがあるため、均等が必要なら列挙で明示するのが安全。本ツールは間隔記法の展開結果も次回日時シミュレーションで可視化します。

5. 日と曜日を両方指定したときのOR条件

POSIX仕様で最も誤解されやすいのが、日(第3フィールド)と曜日(第5フィールド)の両方に *以外を指定したときの挙動です。仕様では「両方が*ではない場合、どちらか一方の条件を満たす日に実行する」OR条件で動きます。例えば「0 0 1 * 1」は「毎月1日の0時 OR 毎週月曜の0時」で発火するため、月1日が月曜以外なら月内最大5〜6回発火することになります。これを「AND条件」(毎月1日かつ月曜だけ)と勘違いすると、想定の数倍の頻度で発火して課金や負荷の事故につながります。「毎月1日が月曜のとき」のように AND が欲しい場合、cron式単体では表現できず、ジョブ側でdate確認をするしかない。一方、片方が * のときは AND と同じ動作になります(例: 「0 0 1 * *」は毎月1日のみ、曜日は全許容で限定にならない)。

6. @daily 等の省略記法・Vixie cron 拡張は仕様外

@daily、@hourly、@weekly、@monthly、@yearly、@reboot などの省略記法は POSIX 仕様には含まれません。これらはVixie cron(Paul Vixie 氏が1987年に書いた実装で、現在の Linux ディストリビューションの大半に取り込まれている)の拡張です。同様に、第3フィールドの「L」(月末日)、「W」(最近平日)、第5フィールドの「#」(第n曜日、例: 1#2 = 第2月曜)、「L」(最終曜日)、曜日の英略SUN〜SATも、Quartz Scheduler や AWS EventBridge の拡張で POSIX 標準外。GitHub Actions・Kubernetes CronJob・Cloudflare Workers・Vercel Cron・Google Cloud Scheduler は基本的に POSIX 5フィールドに準拠していますが、各サービスのドキュメントで個別の拡張サポートを確認するのが安全です。本ツールは POSIX 5フィールド標準のみ対応し、省略記法や拡張記法は解釈しません。本ツールで書いた式が本番で動かない場合、まず POSIX 範囲外の記法を使っていないか確認してください。

手軽屋ツール実践手順

  1. cron式チェッカーを開く
  2. 5フィールドのcron式を貼り付け(POSIX標準準拠)
  3. 各フィールドの意味(分・時・日・月・曜日)を日本語で確認
  4. 次回実行日時10回分のシミュレーションで意図と一致するか確認
  5. 日と曜日を両方指定した場合、OR条件で多発火していないか確認
  6. 本番のcrontabやCI/CDスケジュール欄に貼り付ける

関連ツール

参照: POSIX crontab(The Open Group Base Specifications Issue 7)Google Cloud Scheduler unix-cron scheduleKubernetes CronJob ドキュメント