Cron式パーサー
Cron式はUnix系システムで定期タスクのスケジュールを定義します。このツールはCron構文(5〜7フィールド)を解析し、各フィールドを平易な言葉で説明し、次のスケジュール実行時刻を計算し、よくある間違いについて警告します。ユーザーcrontab形式とシステムcrontab形式(ユーザーおよびコマンドフィールド付き)の両方をサポートします。
仕様
よくあるユースケース
- Cronジョブが期待通りの時間に実行されない理由のデバッグ
- 設定で継承されたCron式の理解
- バックアップとメンテナンスのスケジュール計画
- CI/CDパイプラインスケジュールの検証(GitHub Actions、GitLab CI)
- デプロイ前のKubernetes CronJobスケジュールのテスト
- /etc/crontabまたは/etc/cron.d/のシステムcrontabエントリの分析
機能
- 5フィールド(標準)、6フィールド(秒付き)、7フィールド(秒と年付き)のCron式を解析
- ユーザーフィールド付きシステムcrontab形式のサポート(例: "0 5 * * * root /path/to/script")
- Cronラインからコマンドを抽出・表示
- 各フィールドを人間が読める言葉で説明
- 次の10回のスケジュール実行時刻を計算
- 範囲(1-5)、リスト(1,3,5)、ステップ(*/15)、名前(MON、JAN)のサポート
- スケジュールで31日を指定するなどの一般的な問題について警告
例
ヒント
- 5つのフィールドは: 分(0-59)、時(0-23)、日(1-31)、月(1-12)、曜日(0-6、日曜=0)です。
- システムcrontab(/etc/crontab、/etc/cron.d/*)にはコマンド前にユーザー名の6番目のフィールドがあります。
- ユーザーcrontab(crontab -e)にはユーザー名フィールドはなく、crontabオーナーとして実行されます。
- *は「毎回」、*/nは「n回ごと」を意味します。
- 曜日名(SUN-SAT)と月名(JAN-DEC)は大文字小文字を区別しません。
- 日(day-of-month)と曜日(day-of-week)の同時指定には注意が必要です。動作は実装によって異なります。
解説 Cron式パーサー
CronはUnix系オペレーティングシステムの時間ベースのジョブスケジューラであり、Cron式はジョブの実行タイミングを定義するコンパクトな構文です。標準的な5フィールド形式は、分(0-59)、時(0-23)、日(1-31)、月(1-12)、曜日(0-6、0は日曜日)を指定します。アスタリスク(*)はすべての値にマッチし、「* * * * *」は毎分実行されます。
単純な値以外にも、Cronはいくつかの演算子をサポートしています。範囲(1-5)は連続した範囲にマッチします。リスト(1,3,5)は離散的な値にマッチします。ステップ値(*/15)は定期的な間隔を作成します。これらは組み合わせ可能です: 曜日の1-5/2は月曜、水曜、金曜を意味します。月と曜日のフィールドは3文字の名前(JAN-DEC、SUN-SAT)を受け入れます。
Cronの実装は様々です。ユーザーcrontabは5つのフィールドとコマンドを持ちます。システムcrontabはユーザー名フィールドを追加します。一部の実装は秒の6番目のフィールド(Spring、Quartz、Kubernetes)と年の7番目のフィールドをサポートしています。AWS EventBridge、GitHub Actions、およびその他のクラウドスケジューラにはそれぞれ独自のバリエーションがあります。
よくある落とし穴には、日(day-of-month)と曜日(day-of-week)フィールドの相互作用があります: 両方が指定されている場合(*でない場合)、ジョブはいずれかの条件が真のときに実行されます(OR論理)。タイムゾーンの扱いも問題です。CronジョブはCRON_TZが設定されていない限りシステムのタイムゾーンで実行され、夏時間の移行によりジョブがスキップされたり2回実行されたりする可能性があります。
/演算子はステップ値を作成します。分フィールドの*/5は「5分ごと」を意味し、毎時0、5、10、15、20、25、30、35、40、45、50、55分に実行されます。範囲はステップと組み合わせ可能です: 10-30/5は10分から30分の間で5分ごとを意味します。特定の曜日の特定の時間にジョブを実行するには、分と時のフィールドを希望の時間に、曜日フィールドを対象の曜日に設定します。例えば、「30 14 * * 1-5」は月曜から金曜の午後2:30に実行され、「0 9 * * 0」は毎週日曜の午前9時に実行されます。すべての時間はCRON_TZが明示的に設定されていない限り、サーバーのローカルタイムゾーンで解釈されます。
Cronはウォールクロック時間を使用するため、夏時間の移行が予期しない動作を引き起こす可能性があります。時計が進む場合、午前2:00から2:59の間にスケジュールされたジョブは完全にスキップされる可能性があります。時計が戻る場合、その時間帯のジョブは2回実行される可能性があります。重要なジョブについてはCRON_TZ=UTCを設定することでこれらの問題を回避できます。あるいは、移行時間帯にジョブをスケジュールしないか、重複実行が無害になるようにジョブを冪等に設計してください。
Cron構文はUnixシステムをはるかに超えて採用されています。Kubernetes CronJobs、GitHub Actions、GitLab CI、AWS EventBridge、Google Cloud Scheduler、Spring @Scheduled、および多くのタスクキューライブラリがすべてスケジューリングにCron式を使用しています。ただし、各実装がサポートする機能は異なる場合があります。秒フィールドを追加するもの、年フィールドを追加するもの、日(day-of-month)または曜日(day-of-week)フィールドで「特定の値なし」を意味する?を使用するものがあります。