Cron式を解明:なんでもスケジュール
毎晩午前3時にデータベースのバックアップを実行したい。毎週月曜の朝にレポートを送信したい。15分ごとにキャッシュをクリアしたい。LinuxやUnixサーバーでは、これに使うツールがcronであり、cronにいつ実行するかを伝える方法がcron式です。
cron式は一見すると難しそうに見えます。0 3 * * *や*/15 9-17 * * 1-5は、パターンを知らなければ意味不明に見えるかもしれません。しかし、5つのフィールドを理解すれば、構文は驚くほどシンプルです。
5つのフィールド
標準的なcron式は、スペースで区切られた正確に5つのフィールドで構成されます。各フィールドは時間の単位を表します:
┌───────────── 分 (0-59)
│ ┌───────────── 時 (0-23)
│ │ ┌───────────── 日 (1-31)
│ │ │ ┌───────────── 月 (1-12)
│ │ │ │ ┌───────────── 曜日 (0-7、0と7は日曜日)
│ │ │ │ │
* * * * *
それだけです。5つのフィールドを左から右に:分、時、日、月、曜日。
ご存知ですか? 「cron」という名前はギリシャ語の「chronos」(時間)に由来しています。cronデーモン(バックグラウンドプロセス)は1975年からUnix系オペレーティングシステムの中核部分となっています。
特殊文字
アスタリスク(*)— すべての値
アスタリスクはそのフィールドの「すべての可能な値」を意味します。
* * * * * = 毎日、毎時、毎分。
カンマ(,)— 複数の値
カンマは個々の値を区切ります。
0 9,12,18 * * * = 9時、12時、18時の0分に(午前9時、正午12時、午後6時)。
ダッシュ(-)— 値の範囲
ダッシュは範囲を定義します。
0 9-17 * * * = 9時から17時まで毎時0分に(午前9時から午後5時まで、1時間ごと)。
スラッシュ(/)— ステップ値
スラッシュは間隔を定義します。
*/15 * * * * = 15分ごと(毎時0分、15分、30分、45分)。
0 */2 * * * = 2時間ごとの0分に(午前0時、午前2時、午前4時、...)。
Cron式の読み方:練習
一般的な例を見ていきましょう。それぞれについて、5つのフィールドを左から右に読みます。
0 3 * * * — 毎日午前3時
| フィールド | 値 | 意味 |
|---|---|---|
| 分 | 0 | 0分に |
| 時 | 3 | 3時(午前3時) |
| 日 | * | 毎日 |
| 月 | * | 毎月 |
| 曜日 | * | 毎曜日 |
読み方: 「毎日午前3時に。」夜間バックアップの定番の選択肢です。
*/15 * * * * — 15分ごと
| フィールド | 値 | 意味 |
|---|---|---|
| 分 | */15 | 15分ごと |
| 時 | * | 毎時 |
| 日 | * | 毎日 |
| 月 | * | 毎月 |
| 曜日 | * | 毎曜日 |
読み方: 「24時間、15分ごと。」ヘルスチェックやキャッシュ更新でよく使われます。
0 9 * * 1-5 — 平日午前9時
| フィールド | 値 | 意味 |
|---|---|---|
| 分 | 0 | 0分に |
| 時 | 9 | 9時に |
| 日 | * | 毎日 |
| 月 | * | 毎月 |
| 曜日 | 1-5 | 月曜から金曜 |
読み方: 「月曜から金曜の午前9時に。」日次業務レポートに最適です。
0 0 1 * * — 毎月1日
| フィールド | 値 | 意味 |
|---|---|---|
| 分 | 0 | 0分に |
| 時 | 0 | 0時(深夜0時) |
| 日 | 1 | 1日に |
| 月 | * | 毎月 |
| 曜日 | * | 任意の曜日 |
読み方: 「毎月1日の深夜0時に。」月次レポート、請求、クリーンアップに使用されます。
30 8 * * 1 — 毎週月曜午前8時30分
| フィールド | 値 | 意味 |
|---|---|---|
| 分 | 30 | 30分に |
| 時 | 8 | 8時に |
| 日 | * | 毎日 |
| 月 | * | 毎月 |
| 曜日 | 1 | 月曜日 |
読み方: 「毎週月曜の午前8時30分に。」週次チーム通知に最適です。
自分のCron式を書く
体系的なアプローチを紹介します:
- いつ実行するかから始める。 「毎日午前3時」や「営業時間中5分ごと」など。
- フィールドを左から右に埋める。 分から始めて、時、日、月、曜日の順。
- 「すべて」には
*を使う。 そのフィールドを気にしない場合は*を使用。 - デプロイ前にテスト。 式が期待通りのスケジュールを生成することを必ず確認。
よく使うパターン クイックリファレンス
| スケジュール | 式 |
|---|---|
| 毎分 | * * * * * |
| 5分ごと | */5 * * * * |
| 毎時 | 0 * * * * |
| 毎日深夜0時 | 0 0 * * * |
| 毎日午前3時 | 0 3 * * * |
| 毎週月曜午前9時 | 0 9 * * 1 |
| 平日午前8時30分 | 30 8 * * 1-5 |
| 毎月1日 | 0 0 1 * * |
| 営業時間中15分ごと | */15 9-17 * * 1-5 |
| 1日2回(午前9時と午後6時) | 0 9,18 * * * |
| 毎週日曜午前2時 | 0 2 * * 0 |
よくある間違い
時間が0-23であることを忘れる
13時は午後1時であり、1時ではありません。よくある間違いは、0 1 * * *を午後1時に実行されると思って書いたが、実際には午前1時に実行されるというものです。
曜日の混乱
日曜日は0でも7でもよい(両方有効)。月曜は1、土曜は6。月曜が0だと思う人もいます。
日と曜日の相互作用
日と曜日の両方を指定した場合(どちらも*でない場合)、ほとんどのcron実装ではどちらかの条件が満たされたときにジョブが実行されます。両方が満たされたときではありません。これは多くの人を驚かせます。
注意 式0 9 15 * 1は「15日の午前9時、ただし月曜の場合のみ」という意味ではありません。「毎月15日の午前9時、そして毎週月曜の午前9時」という意味です。これは予想外の動作の一般的な原因です。
タイムゾーンへの注意
cronはサーバーのローカルタイムゾーンで実行されます。サーバーがUTCにあり、あなたがニューヨーク(UTC-5)にいる場合、0 9 * * *のcronジョブはあなたの時間では午前4時に実行されます。サーバーのタイムゾーンを必ず確認してください。
ヒント デプロイ前にcron式をテストして視覚化しましょう:Cron式の読み方とテスト方法。次の実行時刻を確認し、スケジュールが意図通りかを確認できます。
Cron式を作成してテスト:
無料で、即座に、登録不要です。