Cron式の解説:構文、例、および一般的なパターン
· 12分で読めます
Cronは、Unix系オペレーティングシステムで自動化を支える時間ベースのジョブスケジューラーです。データベースのバックアップ、スケジュールされたメールの送信、メンテナンススクリプトの実行など、cron式の理解は開発者やシステム管理者にとって不可欠です。
この包括的なガイドでは、基本的なパターンから高度なスケジューリング技術まで、cron構文について知っておくべきすべてを解説します。自信を持ってcron式を書き、テストし、トラブルシューティングする方法を学びます。
目次
Cronの基本を理解する
Cronは、Unix系システムのバックグラウンドで継続的に実行されるデーモンプロセスで、毎分実行すべきスケジュールされたジョブがあるかどうかをチェックします。この名前は、時間を意味するギリシャ語の「chronos」に由来しています。
システム上の各ユーザーは、スケジュールされたジョブを含む独自のcrontab(cronテーブル)ファイルを持つことができます。システムは、/etc/cron.d/、/etc/cron.daily/、/etc/cron.hourly/などのディレクトリにシステムレベルのタスク用のcrontabも保持しています。
cronジョブが実行されると、crontabを所有するユーザーの権限で実行されます。これはセキュリティとファイルアクセスの考慮事項にとって重要です。ジョブは通常のシェル設定なしの最小限の環境で実行されるため、初心者にとって混乱の原因となることがよくあります。
プロのヒント:Cronジョブは対話型シェル環境にアクセスできません。コマンドとファイルには常に絶対パスを使用し、crontabで必要な環境変数を明示的に設定してください。
Cron構文:5つのフィールド
標準的なcron式は、5つの時刻と日付のフィールドと、その後に実行するコマンドで構成されます。これらのフィールドを理解することは、効果的なcronスケジュールを書くための基本です。
┌───────────── 分 (0-59)
│ ┌───────────── 時 (0-23)
│ │ ┌───────────── 日 (1-31)
│ │ │ ┌───────────── 月 (1-12またはJAN-DEC)
│ │ │ │ ┌───────────── 曜日 (0-7、0と7は日曜日、またはSUN-SAT)
│ │ │ │ │
* * * * * 実行するコマンド
各フィールドは、ジョブがいつ実行されるかを制御する特定の値と特殊文字を受け入れます。各フィールドが何を表すかを詳しく見てみましょう:
| フィールド | 範囲 | 特殊文字 | 説明 |
|---|---|---|---|
| 分 | 0-59 | * , - / | ジョブが実行される正確な分 |
| 時 | 0-23 | * , - / | 24時間形式の時間(0 = 深夜) |
| 日 | 1-31 | * , - / L W | 月の日 |
| 月 | 1-12またはJAN-DEC | * , - / | 年の月(1 = 1月) |
| 曜日 | 0-7またはSUN-SAT | * , - / L # | 週の曜日(0と7 = 日曜日) |
コマンドフィールドには、有効なシェルコマンド、スクリプトパス、またはセミコロンで区切られた一連のコマンドを指定できます。cronジョブからの出力は、リダイレクトされない限り、通常ユーザーにメールで送信されます。
特殊文字と演算子
Cronの力は、柔軟なスケジューリングパターンを可能にする特殊文字から来ています。これらの演算子をマスターすることで、複雑なロジックなしに洗練されたスケジュールを作成できます。
アスタリスク(*) - すべての値に一致
アスタリスクは、フィールドのすべての可能な値に一致するワイルドカード文字です。フィールドで*を使用すると、そのフィールドの範囲内のすべての値でジョブが実行されます。
たとえば、* * * * *は「すべての月のすべての曜日のすべての日のすべての時間のすべての分」を意味します。つまり、毎分実行されます。
カンマ(,) - 複数の値をリスト
カンマを使用すると、複数の個別の値を指定できます。これは、特定の連続しない時間が必要な場合に便利です。
例:0 9,12,15,18 * * *は、毎日午前9時、正午、午後3時、午後6時に実行されます。
ハイフン(-) - 範囲を定義
ハイフンは、包括的な値の範囲を作成します。これは、カンマで多くの連続した値をリストするよりもすっきりしています。
例:0 9-17 * * 1-5は、月曜日から金曜日(営業時間)の午前9時から午後5時まで毎時実行されます。
スラッシュ(/) - ステップ値
スラッシュ演算子は、ステップ間隔を指定します。構文は*/nまたは範囲/nで、nはステップ値です。
例:*/15 * * * *は15分ごとに実行されます(:00、:15、:30、:45)。範囲も使用できます:0-30/5 * * * *は、毎時の前半30分間に5分ごとに実行されます。
拡張文字(L、W、#)
これらは、Vixie cronやQuartzスケジューラーなどの一部のcron実装でサポートされている非標準の拡張機能ですが、標準のUnix cronではサポートされていません。
| 文字 | 意味 | 例 | 説明 |
|---|---|---|---|
L |
最後 | 0 0 L * * |
月の最終日の深夜 |
W |
平日 | 0 0 15W * * |
15日に最も近い平日 |
# |
N回目の出現 | 0 0 * * 5#3 |
毎月第3金曜日 |
クイックヒント:L、W、または#文字を使用する前に、お使いのcron実装がそれらをサポートしているか確認してください。標準のUnix cronはこれらの式を拒否します。互換性をテストするには、Cron式ジェネレーターを使用してください。
一般的なCronパターン
実際のアプリケーションで最も頻繁に使用されるcronパターンを以下に示します。これらは、典型的な自動化タスクのスケジューリングニーズの大部分をカバーしています。
基本的な時間間隔
* * * * *- 毎分(控えめに使用、高負荷を引き起こす可能性があります)*/5 * * * *- 5分ごと*/10 * * * *- 10分ごと*/15 * * * *- 15分ごと(監視スクリプトで一般的)*/30 * * * *- 30分ごと0 * * * *- 毎時0分0 */2 * * *- 2時間ごと0 */4 * * *- 4時間ごと0 */6 * * *- 6時間ごと(1日4回)
毎日のスケジュール
0 0 * * *- 毎日深夜(バックアップとレポートで一般的)0 2 * * *- 毎日午前2時(メンテナンスのための低トラフィック時間)0 9 * * *- 毎日午前9時(営業時間開始)30 4 * * *- 毎日午前4時30分0 0,12 * * *- 1日2回、深夜と正午0 8,20 * * *- 1日2回、午前8時と午後8時
毎週のスケジュール
0 0 * * 0- 毎週日曜日の深夜0 0 * * 1- 毎週月曜日の深夜0 9 * * 1-5- 平日の午前9時0 0 * * 6,0- 週末(土曜日と日曜日)の深夜30 4 * * 1- 毎週月曜日の午前4時30分(週次レポート)0 8-17 * * 1-5- 営業時間中の毎時(午前9時〜午後5時、月〜金)
毎月および毎年のスケジュール
0 0 1 * *- 毎月1日の深夜0 0 15 * *- 毎月15日の深夜0 0 1,15 * *- 毎月1日と15日(隔月)0 0 * * 0- 毎週日曜日(毎週)0 0 1 1 *- 1月1日の深夜(毎年)0 0 1 */3 *- 四半期ごとの初日(1月、4月、7月、10月)0 0 1 6,12 *- 6月1日と12月1日(半年ごと)
プロのヒント:毎月のジョブをスケジュールする際は、28を超える日の値に注意してください。0 0 31 * *を使用すると、31日がある月にのみ実行されます。月末のジョブの場合は、前月の最終日または翌月の初日を使用することを検討してください。
Cron式パーサーを使用してcron式をテストおよび検証し、ジョブがいつ実行されるかを正確に確認してください。
高度なスケジューリング技術
基本的なパターンを超えて、演算子とフィールドを組み合わせて、複雑なビジネス要件に一致する洗練されたスケジュールを作成できます。
複数の条件の組み合わせ
単一のフィールドで複数の演算子を使用して、微妙なスケジュールを作成できます。たとえば、0 9,12,15 * * 1-5は、午前9時、正午、午後3時に実行されますが、平日のみです。
別の例:*/10 8-17 * * 1-5は10分ごとに実行されますが、営業時間(午前8時〜午後5時)の平日のみです。
日と曜日
日と曜日の両方が指定されている場合(*ではない)、ジョブはいずれかの条件が満たされたときに実行されます(ANDロジックではなくORロジック)。これは混乱の一般的な原因です。
たとえば、0 0 13 * 5は、毎月13日の深夜または毎週金曜日に実行され、13日の金曜日だけではありません。
13日の金曜日に特定のものをスケジュールするには、両方の条件をチェックするスクリプトを使用する必要があります:
0 0 13 * * [ $(date +\%u) -eq 5 ] && /path/to/script.sh
範囲でのステップ値の使用
範囲とステップ値を組み合わせて、正確な制御を行うことができます。構文開始-終了/ステップは、特定の範囲内の間隔で実行されます。
例:
0-30/5 * * * *- 毎時の前半30分間に5分ごと(:00、:05、:10、:15、:20、:25、:30)0 9-17/2 * * *- 午前9時から午後5時まで2時間ごと(午前9時、午前11時、午後1時、午後3時、午後5時)0 0 1-7 * 1- 毎月第1月曜日(1日から7日までが月曜日の場合に実行)