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日を指定するなどの一般的な問題について警告

平日の午前9時

試してみる →

月曜日から金曜日の午前9:00に実行。

0 9 * * 1-5

毎時0、15、30、45分に実行。

*/15 * * * *

ユーザーとコマンド付きシステムCrontab

試してみる →

rootユーザーとして午前5時に実行される日次バックアップ(/etc/crontabのシステムcrontab形式)。

0 5 * * * root /usr/bin/backup.sh

コマンド付きCron(ユーザーCrontab)

試してみる →

5分ごとのヘルスチェック(ユーザーcrontab形式)。

*/5 * * * * curl -s http://localhost/health

毎月1日の深夜0時に実行。

0 0 1 * *

ヒント

  • 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)フィールドで「特定の値なし」を意味する?を使用するものがあります。

← すべてのツールに戻る