クロン式ジェネレーター

視覚的にcronジョブのスケジュールを構築して理解します。

クイックプリセット

* * * * *

次の5回の実行

cron構文リファレンス

* · 任意の値

*/5 · 5単位ごと

1,15 · 値1と15で

1-5 · 1から5の範囲

フィールド: 分(0-59)、時(0-23)、月の日(1-31)、月(1-12)、曜日(0-6、0=日曜日)

cron 式の簡単な歴史

5フィールドの cron 式は 1975年5月に遡り、初期バージョンが AT&T Bell Laboratories から Research Unix Version 7 の一部として出荷されました。名前は Chronos、ギリシャの時間の擬人化を暗示しています。フォーマットはシンプルでした:/usr/lib/crontab の1行に空白で区切られた5つのフィールド(分、時、月の日、月、曜日)。Paul Vixie による1987年Vixie cron リライトが事実上のモダン実装になりました。すべての主要な Linux ディストリビューションは Vixie 派生の cron を出荷し、Vixie はユーザーごとの crontab、環境変数サポート(MAILTO=CRON_TZ=)、そして誰もが今日使用する @hourly / @daily / @reboot ショートカットマクロを追加しました。cron 式構文はその後、2つの経路に分かれました。Quartz Scheduler(Java、James House、1998;Apache および Terracotta に寄贈)は、先頭の秒フィールド、オプションの末尾の年フィールド、および L(最後)/W(平日)/#(n 番目の出現)演算子を追加し、AWS EventBridge(元は CloudWatch Events、2014)と Spring の @Scheduled アノテーションが後に採用した6フィールドの cron を生み出しました。Azure Functions(2016)が使用する NCronTab フォーマットは秒を最初に置きましたが5つの動作フィールドを維持しました。クラウド時代はその後、5フィールドの Vixie フォーマットを共通語として標準化しました:Kubernetes CronJobs(2016年に alpha 1.4、2021年に GA 1.21)はちょうど5フィールドを受け入れます、GitHub Actionson.schedule.cron、2019)、GCP Cloud Scheduler(2018)、Vercel Cron Jobs(2022)も同様です。このツールが属するビジュアル cron ビルダーは2010-2015年頃に出現しました:crontab.guru(Christine Dodrill、2014)が最も引用される参照になり、cron-descriptor ライブラリ(Brady Holt、元は .NET、Java/Python/JS に移植)が、デコーダーとジェネレーターが依存する「平易な英語の cron」翻訳層のほとんどを動かしました。Bell Labs から半世紀後、同じ5つのフィールドが今でも世界の夜間バックアップをスケジュールしています。

cron 式の構造

式が使われる場所

標準、方言、マイルストーン

その他のよくある質問

5フィールドは6または7フィールドと同じですか?

いいえ。古典的な POSIX 形式は5フィールド(分、時、月の日、月、曜日)です。Quartz と Spring は先頭の秒列を追加することで6フィールドを使用し、Quartz はオプションの7番目の年フィールドを受け入れます。AWS EventBridge は常に年で終わる6フィールドを使用します(cron(min hr dom mon dow yr))。5フィールドの式を Quartz または Spring に貼り付けると構文エラーが発生します;6フィールドの式を Linux に貼り付けると、フィールドを静かに誤解釈します。

cron が表現できる最小の間隔は何ですか?

標準 Unix cron で1分ごと(* * * * *)。組み込みの秒フィールドはありません。サブ分のケイデンスが必要な場合は Quartz や NCronTab などのスケジューラがそれを追加し、systemd タイマーは OnUnitActiveSec=30s を使用できます。GitHub Actions は最短のケイデンスを5分にキャップし、EventBridge はスケジュールされた時刻の60秒ウィンドウ内に発火するので、cron をハードリアルタイムの精度に頼らないでください。

月の最終日にジョブを実行するにはどうすればよいですか?

標準の5フィールド cron にはネイティブの「月の最終日」演算子はありません。Quartz と AWS EventBridge は月の日フィールドで L をサポートします:0 0 L * ? は最終日の深夜に発火します。素の Linux cron では、通常の回避策は候補日に毎日スケジュールしてコマンドをゲートすることです:0 0 28-31 * * [ "$(date +\%d -d tomorrow)" = "01" ] && /path/to/script。systemd タイマーは OnCalendar=*-*-* 00:00:00 で直接表現します。

なぜ私の cron ジョブは予期したときに実行されなかったのですか?

通常の容疑者、順番に:(1) サーバーが想定とは異なるタイムゾーンにある(date で確認);(2) PATH がインタラクティブシェルのものとは異なるため、コマンドはプロンプトで動作するが cron 下では失敗する(絶対パスを使用);(3) 出力が電子メールに送られたが見逃した(MAILTO="" を設定するか、ログファイルにリダイレクト);(4) cron デーモンが実行されていない(systemctl status cron);(5) OR トラップ(上記参照)が意図しない余分な日に発火している。

cron、anacron、systemd タイマーの違いは何ですか?

Cron はシステムがスケジュールされた時刻に稼働していることを期待し、ダウンタイム中に発生するジョブを静かにスキップします:常時稼働サーバーには良いが、ラップトップには悪い。Anacron はジョブごとの最終実行タイムスタンプを追跡し、再起動後に見逃したジョブをキャッチアップしますが、分単位ではなく日単位の精度というコストがかかります。systemd タイマーはほとんどのモダン Linux ディストリビューションで cron を置き換えます:カレンダーとモノトニックの両方のスケジュールをサポートし、journald にログを記録し、サービス依存性を宣言でき、Persistent=true を使用して cron 風の精度を anacron 風のキャッチアップと組み合わせます。

タイムゾーンと夏時間は cron にどのように影響しますか?

ほとんどの cron デーモンはシステムのタイムゾーンでスケジュールを解釈します。クラウドサーバーではこれは通常 UTC を意味するので、0 9 * * * は午前9時 UTC で発火し、午前9時ローカルではありません。Linux crontab で CRON_TZ=America/New_York を設定します;Kubernetes は spec.timeZone を使用します;AWS、GCP、Vercel はそれぞれ明示的な IANA ゾーンを受け取ります。春の前進中、スキップされた時間内にスケジュールされたジョブは Vixie cron によって直後に実行されますが、AWS EventBridge では完全にスキップされます。最も安全なパターンは、cron を UTC に残してジョブ内で変換することです。

関連ツール