Cron式の説明:完全な構文ガイド
· 12分で読めます
📑 目次
Cronは、Unix系オペレーティングシステムにおける時間ベースのジョブスケジューラーです。深夜にスクリプトを実行したり、毎週日曜日にデータベースをバックアップしたり、1時間ごとに一時ファイルをクリアしたり、毎月1日にレポートを送信したりする必要がある場合、cronがあなたのツールです。しかし、その式の構文 — 0 */6 * * 1-5のような不可解な文字列 — は最初は威圧的に感じるかもしれません。
このガイドは、cron式を完全に解明します。すべてのフィールド、すべての特殊文字を学び、数十の実世界のパターンを見て、経験豊富な開発者でさえつまずくタイムゾーンの落とし穴を理解できます。バックアップのスケジューリング、メンテナンススクリプトの実行、レポートの自動化など、cron構文の習得は、すべての開発者やシステム管理者にとって不可欠です。
Cron式の構造
標準的なcron式は、スペースで区切られた5つのフィールドを持ちます。各フィールドは時間の単位を表し、それらが一緒になってジョブがいつ実行されるべきかを正確に定義します。
┌───────────── 分 (0-59)
│ ┌─────────── 時 (0-23)
│ │ ┌───────── 日 (1-31)
│ │ │ ┌─────── 月 (1-12)
│ │ │ │ ┌───── 曜日 (0-6, 日=0)
│ │ │ │ │
* * * * * 実行するコマンド
各フィールドには、数値、範囲、リスト、ステップ値、またはワイルドカードを含めることができます。cronの美しさは、これらのシンプルな構成要素が組み合わさって、信じられないほど柔軟なスケジューリングパターンを作成できることです。
一部のcron実装では、秒用の6番目のフィールドと年用の7番目のフィールドをサポートしていますが、標準的な5フィールド形式は普遍的にサポートされており、Linux、macOS、BSD系を含むほとんどのUnix系システムで遭遇するものです。
5つのフィールドの詳細
各フィールドの範囲と動作を理解することは、正しいcron式を書くために重要です。それぞれを体系的に見ていきましょう。
| フィールド | 範囲 | 特殊文字 | 例 |
|---|---|---|---|
| 分 | 0-59 | * , - / | */15 (15分ごと) |
| 時 | 0-23 | * , - / | 9-17 (午前9時から午後5時) |
| 日 | 1-31 | * , - / L W | 1,15 (1日と15日) |
| 月 | 1-12 または JAN-DEC | * , - / | 1-6 (1月から6月) |
| 曜日 | 0-6 または SUN-SAT | * , - / L # | 1-5 (月曜日から金曜日) |
分フィールド (0-59)
分フィールドは、ジョブが実行される時間の分を制御します。0の値は時間の始まり、30は30分、59は時間の最後の分を意味します。
一般的なパターンには、5分ごとの*/5、1時間に2回の0,30、または毎時15分の15が含まれます。
時フィールド (0-23)
時間は24時間形式を使用し、0は深夜、12は正午、23は午後11時です。これは、12時間のAM/PM表記に慣れている開発者にとって、最も一般的な混乱の原因の1つです。
営業時間は通常9-17(午前9時から午後5時)として表され、夜間のメンテナンスは0-6(深夜から午前6時)を使用する場合があります。
日フィールド (1-31)
このフィールドは、実行する月の日を指定します。有効な値は1から31ですが、すべての月に31日があるわけではありません。Cronはこれを適切に処理します — 2月に31日を指定すると、その月はジョブが実行されないだけです。
特殊文字Lは「月の最終日」を意味し、月の長さとうるう年に自動的に調整されます。
月フィールド (1-12)
月は数値(1月の1から12月の12)または3文字の略語(JAN、FEB、MARなど)を使用して指定できます。略語はほとんどの実装で大文字小文字を区別しません。
四半期ごとのスケジュールでは、1,4,7,10(1月、4月、7月、10月)や会計四半期末の3,6,9,12のようなパターンがよく使用されます。
曜日フィールド (0-6)
曜日は0(日曜日)から6(土曜日)までの範囲です。一部のシステムでは、便宜上7も日曜日として受け入れます。3文字の略語(SUN、MON、TUEなど)もサポートされています。
最も一般的なパターンは、平日(月曜日から金曜日)の1-5で、0,6または6,0は週末を表します。
プロのヒント: 日と曜日の両方が指定されている場合(ワイルドカードではない)、ジョブはいずれかの条件が満たされたときに実行されます(OR論理)、両方ではありません。これは多くの開発者を驚かせます。例えば、0 0 13 * 5は毎月13日と毎週金曜日に実行され、13日の金曜日だけではありません。
特殊文字の説明
特殊文字は、cron式に力と柔軟性を与えるものです。各文字は、スケジューリングパターンを定義する上で特定の目的を果たします。
アスタリスク (*) - ワイルドカード
アスタリスクは、そのフィールドの「すべての可能な値」を意味します。これは最も一般的に使用される特殊文字で、ほぼすべてのcron式に現れます。
* * * * *— 毎日毎分実行0 * * * *— 毎時0分に実行0 0 * * *— 毎日深夜に実行
カンマ (,) - リスト区切り文字
カンマを使用すると、複数の個別の値を指定できます。これは、特定の連続しない時間が必要な場合に最適です。
0 9,12,15,18 * * *— 午前9時、正午、午後3時、午後6時に実行0 0 1,15 * *— 毎月1日と15日の深夜に実行0 0 * * 1,3,5— 月曜日、水曜日、金曜日の深夜に実行
ハイフン (-) - 範囲演算子
ハイフンは包括的な範囲を定義し、連続した期間を簡単に指定できます。
0 9-17 * * *— 午前9時から午後5時まで毎時実行0 0 * * 1-5— 月曜日から金曜日の深夜に実行0 0 1-7 1 *— 1月の最初の週に毎日実行
スラッシュ (/) - ステップ値
スラッシュはステップ間隔を指定し、範囲内で定期的な間隔でジョブを実行できます。構文は開始/ステップまたは範囲全体の*/ステップです。
*/15 * * * *— 15分ごと (0, 15, 30, 45)0 */2 * * *— 2時間ごと (0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22)0 0 */3 * *— 3日ごと (1日、4日、7日、10日など)0 9-17/2 * * *— 午前9時から午後5時の間で2時間ごと (9, 11, 13, 15, 17)
クイックヒント: */15は「今から15分ごと」を意味するのではなく、毎時0分、15分、30分、45分を意味します。10:07にcronジョブを追加した場合、*/15パターンは10:22ではなく10:15に最初に実行されます。
L - 最終日
L文字は「最後」を意味し、日フィールドと曜日フィールドで使用されます。月の長さが異なることを考慮する必要がある月末処理に特に便利です。
0 0 L * *— 毎月の最終日の深夜に実行0 0 * * L— 週の最終日(土曜日)の深夜に実行0 0 * * 5L— 毎月の最後の金曜日に実行
W - 最も近い平日
W文字は、指定された日に最も近い平日を見つけます。指定された日が週末に当たる場合、ジョブは代わりに最も近い平日に実行されます。
0 0 15W * *— 15日に最も近い平日に実行0 0 1W * *— 月の最初の平日に実行0 0 LW * *— 月の最後の平日に実行
ハッシュ (#) - N番目の曜日
ハッシュ文字は、月内の曜日のN番目の出現を指定します。構文は曜日#出現です。
0 0 * * 1#1— 毎月の最初の月曜日0 0 * * 5#2— 毎月の2番目の金曜日0 0 * * 3#4— 毎月の4番目の水曜日
L、W、#はすべてのcron実装でサポートされているわけではないことに注意してください。これらはVixie cronや最新のクラウドベースのスケジューラーなどの最新バージョンで利用できますが、古いUnixシステムでは動作しない場合があります。
一般的なCronパターン
定期的に使用する実世界のスケジューリングパターンを見てみましょう。これらの例は、最も一般的な自動化シナリオをカバーしています。
毎分、毎時、毎日
* * * * *— 毎分(控えめに使用、負荷の問題を引き起こす可能性があります)0 * * * *— 毎時0分0 0 * * *— 毎日深夜0 12 * * *— 毎日正午
1日に複数回
0 0,12 * * *— 1日2回、深夜と正午0 */6 * * *— 6時間ごと (0:00, 6:00, 12:00, 18:00)0 8,12,16,20 * * *— 特定の時間に1日4回*/30 * * * *— 30分ごと
週次スケジュール
0 0 * * 0— 毎週日曜日の深夜0 0 * * 1-5— 平日の深夜0 9 * * 1— 毎週月曜日の午前9時0 0 * * 6,0— 週末の深夜
月次スケジュール
0 0 1 * *— 毎月1日の深夜0 0 L * *— 毎月の最終日の深夜0 0 1,15 * *— 毎月1日と15日0 0 1 */3 *— 四半期の最初の日(1月、4月、7月、10月)
営業時間とメンテナンスウィンドウ
0 9-17 * * 1-5— 営業時間中の毎時(午前9時〜午後5時、月〜金)*/15 9-17 * * 1-5— 営業時間中の15分ごと0 2 * * *— 毎日午前2時(一般的なメンテナンスウィンドウ)0 3 * * 0— 毎週日曜日の午前3時(週次メンテナンス)
| ユースケース | Cron式 | 説明 |
|---|---|---|
| データベースバックアップ | 0 2 * * * |
毎日午前2時 |
| ログローテーション | 0 0 * * 0 |
毎週日曜日の深夜 |
| キャッシュクリア |