Cron エクスプレッション例: 30 スケジュール説明 (落とし穴)
クロンの構文をフィールドごとに学び、テストされた 30 のクロンの表現を N 分毎にコピーします。週日、月間仕事、営業時間など、時間帯のトラブル。
· 8 分で読めます
Cronは1970年代以降、Unixシステムで繰り返し作業をスケジュールしており、その5フィールドの構文は、現在Kubernetes CronJobs、GitHub Actions、AWS EventBridgeやGoogle Cloud Schedulerなどのクラウドスケジューラー、CIパイプライン、数え切れないほどのジョブライブラリを駆動しています。シンタクスは覚えやすいほどコンパクトですが多くのエンジニアが間違ったタイミングで実行された少なくとも1つのスケジュールを送り出しています。このガイドは各分野を説明し、その後 30の実用的な表現を列挙し、罠について注釈します。
5つのフィールド
┌───────────── minute (0–59)
│ ┌─────────── hour (0–23)
│ │ ┌───────── day of month (1–31)
│ │ │ ┌─────── month (1–12 or JAN–DEC)
│ │ │ │ ┌───── day of week (0–6 or SUN–SAT; 7 is also Sunday on most systems)
│ │ │ │ │
* * * * *
各フィールドは、以下を承認します。
*すべての値5は5を意味します。- リスト
1,15は 1 と 15 を意味します。 - 範囲
9-17は 9 から 17 までを含む。 - ステップ
*/15は最小値から始まる 15 番目の値を表す。10-50/20は 10、30、50 を表す。
現在の時間がすべてのフィールドに一致するときに実行されます。下記に記載されている重要な例外を除いて。[cron式解析] (/tools/cron-parser) に任意の表現を貼り付けると、平行言語の記述と次の実行時間が表示されます。
N分または時間ごとに
* * * * *毎分*/5 * * * *5分ごとに (時:00、:05、:10 ...)。*/15 * * * *15分ごとに0,30 * * * *30分ごとに7 * * * *毎時間7分過ぎ。不規則な時間を選ぶことで忙しい時間から負荷を分散します0 */2 * * *2時間毎に 00時,02時,04時..。0 */6 * * *1日4回 00:00、06:00、12:00、18:0015 8-18/2 * * *8時15分,10時15分,12時15分,14時15分,16時15分そして18時15分
ピットフォール: ステップはすべての境界で再起動します。*/7は:00、:07...:56で発射し、また:00で発射します。60を割り切らない確固とした間隔が必要なら時間を割り切るスケジュールを使います
日々のスケジュール
0 0 * * *毎日の真夜中に30 2 * * *毎日2時半典型的なバックアップ窓0 9,17 * * *9時と17時毎日0 12 * * *12時45 23 * * *23時45分昼前半に日末のレポート
**ピットフォール:**現地時間 01:00〜03:00の間の仕事は、夏令間に2回スキップまたは実行することができます。サーバーが DST のゾーンを使用している場合は、そのウィンドウの外で重要なタスクをスケジュールするか、UTC でサーバーを実行してください。
平日・週末
0 9 * * 1-59時月金*/10 9-17 * * 1-5平日の営業時間 (最終回は17時50分) で10分ごとに0 10 * * 6,0土曜と日曜は10時0 8 * * MON毎週月曜の8時。ほとんどの実装では、名前には小字が入れません。30 16 * * 5金曜日 16時30分
月間・年間
0 0 1 * *毎月の初日の真夜中0 6 15 * *毎月15日6時0 0 1,15 * *1日目と15日目給与簿に共通する0 0 1 1 *1月1日の真夜中0 9 1 */3 *毎四半期 (01月,4月,7月,10月) の初日の9時0 0 L * *月最後の日。注:Lは、クォーツ、いくつかのクラウドスケジューラー、いくつかのライブラリがサポートする拡張機能ですが、クラシックUnix cronではサポートされません。0 22 28-31 * *はスクリプト内のチェック ([ "$(date -d tomorrow +%d)" = "01" ]) と組み合わせて、標準クロンで月の最後の日に実行するためのポータブルな方法です。
月曜日か週曜日か?
0 9 13 * 5多くの人はこれを"13日の金曜日"と読みます。クラシッククロンでは "月"日の13日目と"月"日の金曜日"という意味です。両方のデイフィールドが制限されている場合 (*もそうではない場合)、Vixie cronとその子孫は いずれかが一致するときに作業を実行します。
13日 (金) にのみ実行するには、0 9 13 * *をスケジュールしてスクリプトの平日のチェックをします。または明示的な AND セマンティックを持つスケジュールを使用します。これはcronで最も驚くべきルールで覚えておく価値があります
特別な弦
多くのcron実装はショートカットを受け入れます:
@hourly0 * * * *と同じです@dailyまたは@midnight0 0 * * *@weekly—0 0 * * 0.@reboot起動時に一度 (Unix cronのみ、KubernetesやGitHub Actionsでは利用できません)。
プラットフォームの違い
- Kubernetes CronJobs は標準的な5フィールドの構文を使用しています。Kubernetes 1.27 から、
spec.timeZone: "Europe/Berlin"を設定できます.そうでなければ、スケジュールはコントローラマネージャーのゾーンに従います.これは通常 UTC です。 - GitHub Actionsのスケジュールは常に UTC で実行され、高負荷期間に遅延され、最小間隔は5分です。精度が重要なら
0 * * * *を避け奇数分を選びます - AWS イベントブリッジは6つのフィールド (
minute hour day-of-month month day-of-week year) を使用し,2つのデイフィールドの1つで?が必要です。 - **クォーツ (Java) **と スプリングは6~7つのフィールドを使用し、最初の秒は
0 0 9 * * MON-FRIです。 - systemdタイマーは、異なる、より読みやすい文法 (
OnCalendar=Mon..Fri 09:00) を使用し、Persistent=trueで逃げた実行を処理します。
表現をコピーする前にどの方言がプラットフォームに期待されているか確認してください
時間帯
Cronはスケジューラーのタイムゾーンの表現を評価します。東京の開発者によって0 9 * * *と書かれた仕事は、東京のUTCサーバーで09:00 UTCで実行されます。推奨事項:
- サーバーとスケジューラーをUTCで実行し、スケジュールを書き込むときに意図したローカル時間をUTCに変換します。
- DST の変更に伴い、現地営業時間に従わなければならない場合、明示的なタイムゾーンをサポートするスケジューラーを使用します。
- UTCで実行される各時間のタイムスタンプを記録する.理由については[Unixタイムスタンプガイド] (/blog/unix-timestamp-explained) を参照してください。
雇用を安定させる
正しいタイミングは半分の戦いだ
- *重複を防ぐ。 * 作業が間隔よりも長く実行できる場合は、ロック (Unixでは
flock、KubernetesではconcurrencyPolicy: Forbid) を使用します。 - ** 職務を無効にすること.** 2回実行される仕事、例えば再試行やDSTの重複後、顧客に二重料金をかけないべきです。
- **キャプチャ出力.**クラシックなcronメールはローカルユーザーに出力されますが、通常は行きません。ログにリダイレクトして障害を警告します
- 絶対経路を使用します. Cron は最小限の環境と
PATHで実行されます。shell で動作するスクリプトは cron で失敗することが多いです。 - 静寂を監視する. 仕事がチェックインしていないときに警鐘を鳴らすハートビートサービスは、そうでなければ静かに失敗するスケジュールが壊れたことを発見します。
まとめ
Cronの5つのフィールドは、リスト、範囲、ステップと組み合わせて、ほぼすべての繰り返されるスケジュールをカバーします。両方の日欄が設定されたときの OR ルール、境界線でリセットされるステップ、01:00 〜 03:00 頃の DST、および追加のフィールドを持つプラットフォーム方言を注意してください。展開する前に実行される表現を表示するパーサーで確認します
このページは英語から自動翻訳されています。誤りを見つけた場合はお知らせください。