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文字の略語(JANFEBMARなど)を使用して指定できます。略語はほとんどの実装で大文字小文字を区別しません。

四半期ごとのスケジュールでは、1,4,7,10(1月、4月、7月、10月)や会計四半期末の3,6,9,12のようなパターンがよく使用されます。

曜日フィールド (0-6)

曜日は0(日曜日)から6(土曜日)までの範囲です。一部のシステムでは、便宜上7も日曜日として受け入れます。3文字の略語(SUNMONTUEなど)もサポートされています。

最も一般的なパターンは、平日(月曜日から金曜日)の1-5で、0,6または6,0は週末を表します。

プロのヒント: 日と曜日の両方が指定されている場合(ワイルドカードではない)、ジョブはいずれかの条件が満たされたときに実行されます(OR論理)、両方ではありません。これは多くの開発者を驚かせます。例えば、0 0 13 * 5は毎月13日毎週金曜日に実行され、13日の金曜日だけではありません。

特殊文字の説明

特殊文字は、cron式に力と柔軟性を与えるものです。各文字は、スケジューリングパターンを定義する上で特定の目的を果たします。

アスタリスク (*) - ワイルドカード

アスタリスクは、そのフィールドの「すべての可能な値」を意味します。これは最も一般的に使用される特殊文字で、ほぼすべてのcron式に現れます。

カンマ (,) - リスト区切り文字

カンマを使用すると、複数の個別の値を指定できます。これは、特定の連続しない時間が必要な場合に最適です。

ハイフン (-) - 範囲演算子

ハイフンは包括的な範囲を定義し、連続した期間を簡単に指定できます。

スラッシュ (/) - ステップ値

スラッシュはステップ間隔を指定し、範囲内で定期的な間隔でジョブを実行できます。構文は開始/ステップまたは範囲全体の*/ステップです。

クイックヒント: */15は「今から15分ごと」を意味するのではなく、毎時0分、15分、30分、45分を意味します。10:07にcronジョブを追加した場合、*/15パターンは10:22ではなく10:15に最初に実行されます。

L - 最終日

L文字は「最後」を意味し、日フィールドと曜日フィールドで使用されます。月の長さが異なることを考慮する必要がある月末処理に特に便利です。

W - 最も近い平日

W文字は、指定された日に最も近い平日を見つけます。指定された日が週末に当たる場合、ジョブは代わりに最も近い平日に実行されます。

ハッシュ (#) - N番目の曜日

ハッシュ文字は、月内の曜日のN番目の出現を指定します。構文は曜日#出現です。

LW#はすべてのcron実装でサポートされているわけではないことに注意してください。これらはVixie cronや最新のクラウドベースのスケジューラーなどの最新バージョンで利用できますが、古いUnixシステムでは動作しない場合があります。

一般的なCronパターン

定期的に使用する実世界のスケジューリングパターンを見てみましょう。これらの例は、最も一般的な自動化シナリオをカバーしています。

毎分、毎時、毎日

1日に複数回

週次スケジュール

月次スケジュール

営業時間とメンテナンスウィンドウ

ユースケース Cron式 説明
データベースバックアップ 0 2 * * * 毎日午前2時
ログローテーション 0 0 * * 0 毎週日曜日の深夜
キャッシュクリア