Cronwise

Cron式の基本:5フィールドを理解する

すぐに活用できる標準cron構文のわかりやすい解説

Cronエクスプレイナーを試す

経験豊富な開発者でもCron式につまずく理由

ほとんどのcronミスはデプロイ前に始まります。スケジュールの意図と構文が乖離するのです。毎平日午前8時にジョブを実行したいのに、値の配置を間違えると毎時実行や毎日実行にシフトしてしまいます。根本原因はほとんど常に同じです:cron式の5つのフィールドはコンパクトで、位置依存型で、寛容ではありません。

標準cron式は、スペースで区切られた5つのフィールドからなる1行です。各フィールドは時間の単位にマッピングされ、それらが合わさって繰り返しスケジュールを定義します。デフォルトではラベルもキーワードもなく、スケジューラがその行を読み込んだ後に曖昧さの余地はありません。

この記事では、5フィールドcronフォーマットの構造をわかりやすい言葉で説明します。各フィールドが制御するもの、一般的なトークンの仕組み、典型的な誤読が発生する場所を学びます。すべての例はCronwise Cronエクスプレイナーで即座に確認でき、入力した式に対するわかりやすい説明とタイムゾーン対応の次回実行プレビューを提供します。

初めてのcrontabエントリを書く場合でも、他の人が書いたスケジュールをレビューする場合でも、これら5つのフィールドを理解することが、その後のすべてのcronワークフローの基礎となります。

5つのフィールド:各フィールドが制御するもの

すべての標準cron式は同じ位置フォーマットに従います。左から右へ、5つのフィールドは:

位置フィールド許容値説明
10 – 59ジョブが実行される時刻の分
20 – 231日の時間(24時間表記)
31 – 31カレンダー上の日
41 – 12年の月
5曜日0 – 7曜日(0と7は両方とも日曜日)

具体的な例でマッピングが明確になります。式30 8 * * 1-5の意味は:分30、時8、毎月のすべての日、すべての月、ただし月曜日から金曜日のみ。わかりやすく言えば:午前8:30、月曜日から金曜日。

アスタリスク(*)はそのフィールドのすべての許容値に一致するワイルドカードです。見かけたら「すべて」と読んでください。つまり* * * * *は毎日の毎時間の毎分を意味します。標準cronで可能な最も頻繁なスケジュールです。

一般的なトークンとその仕組み

アスタリスクのワイルドカード以外にも、cronフィールドは範囲、インターバル、リストを表現するいくつかのトークンをサポートしており、個別のエントリを書く必要がありません。

カンマ(リスト)

カンマは個々の値を区切ります。0 9,12,18 * * *は毎日午前9:00、午後12:00、午後6:00に実行されます。リスト内の各値は独立して処理されます。

ハイフン(範囲)

ハイフンは連続した範囲を定義します。0 9-17 * * *は午前9:00から午後5:00まで毎時0分に実行されます。範囲は両端を含みます。

スラッシュ(ステップ)

スラッシュはインターバルを定義します。*/15 * * * *は分0から始まって15分ごとに実行されます。範囲とステップを組み合わせることもできます:0-30/10 * * * *は毎時の分0、10、20、30に実行されます。

トークンの組み合わせ

トークンは1つのフィールド内で混在させることができます。0 8-12,18 * * 1-5は時8から12と時18の0分に実行されますが、平日のみです。各フィールドは独立して評価され、スケジューラは5つのフィールドすべてが同時に一致した時に実行します。

式の読み方のより詳しい解説については、一目で式を解析するためのメンタルモデルをカバーしたCron式を素早く読む方法をご覧ください。

実際のスケジュールの解釈方法

cron式を正しく読むとは、各フィールドを順番に翻訳し、1つの文にまとめることです。わかりやすい言葉での同等表現を持つ実践的な例を示します:

意味使用場面リスクの注意事項
0 0 * * *毎日深夜日次バッチジョブ、ログローテーション多くのジョブがこの時間帯を共有すると負荷が高くなる
*/5 * * * *5分ごとヘルスチェック、キューポーリング高頻度:ジョブが冪等であることを確認
0 9 1 * *毎月1日の午前9:00月次レポート31日未満の月でも正常に動作
30 2 * * 0毎週日曜日の午前2:30週次メンテナンスウィンドウ春のDST切り替えと重なる可能性あり
0 */2 * * 1-5平日の2時間ごと営業時間中のポーリング0, 2, 4 … 22に実行 — 営業時間だけではない

最後の例はよくある誤解です。時フィールドの*/2は0からの2時間ごとを意味し、営業時間中の2時間ごとではありません。午前9時から午後5時のみにしたい場合は、代わりに0 9-17/2 * * 1-5が必要です。これはまさにCronwiseエクスプレイナーがタイムゾーンでの次回10回のスケジュール実行を表示することで検出する微妙なミスの種類です。

エッジケースとフィールドの制限

5フィールドフォーマットには忘れやすい境界があります。それらを理解することでサイレントな障害を防ぎます。

日と曜日の相互作用

標準cronでは、日(フィールド3)と曜日(フィールド5)の両方が非ワイルドカードの値に設定されている場合、ほとんどの実装はそれらを和集合(OR条件)として扱います:いずれかの条件が真であればジョブが実行されます。つまり0 9 15 * 1は「15日が月曜日の場合」を意味するのではなく、「毎月15日毎週月曜日」を意味します。これはcronで最も頻繁に報告される驚きの一つです。

月と曜日の境界

日を31に設定すると、31日ある月(1月、3月、5月、7月、8月、10月、12月)のみジョブが実行されます。短い月は静かにスキップされます。同様に、曜日の値0と7はどちらも日曜日を表しますが、同じ式で混在させるとコードレビュー時に混乱を招く可能性があります。

タイムゾーン依存性

cron式自体にはタイムゾーン情報が含まれていません。スケジューラは、設定されたタイムゾーン(UTC、サーバーのローカルタイム、または明示的なオーバーライド)で時刻を解釈します。チームが複数のタイムゾーンにまたがる場合は、デプロイ前に必ずスケジューラのタイムゾーン設定を確認してください。Cronwiseでは任意のIANAタイムゾーンを選択して実行をプレビューできます。

Cronwiseワークフローで学んだことを活用

5つのフィールドを理解したら、次のステップはcron式を読むことから自信を持って構築することへの移行です。Cronwiseはこのための2つの補完的なパスを提供します。

まず説明、次に生成

Cronエクスプレイナーから始めて、既存の式を確認しましょう。貼り付けて、わかりやすい要約を読み、次回実行テーブルをスキャンします。スケジュールが意図したものでない場合は、Cronジェネレーターに切り替えて、フィールドごとにビジュアルに正しい式を構築しましょう。ジェネレーターはドロップダウンとタブから値を選択させることで、構文の推測を排除します。

デプロイ前の確認チェックリスト

確認項目重要な理由合格基準
わかりやすい要約が意図と一致フィールド順序のミスを検出要約文がスケジューリング目標と一致
次回実行タイムスタンプが正確トークンの誤用(範囲、ステップ)を検出最初の5回の実行が期待する日時と一致
タイムゾーンがターゲット環境と一致数時間ずれた実行を防止選択したタイムゾーンがスケジューラの設定済みタイムゾーンと等しい
バリデーション警告なしリスクのあるパターンを早期に検出警告ゼロ、または各警告を意図的に承認

ビジュアルビルダーの完全なウォークスルーについては、タブナビゲーション、保存プリセット、エクスポートオプションをカバーするビジュアルCronジェネレーター:ステップバイステップワークフローをご覧ください。

まとめ:自信を持ってデプロイ

5フィールドcronフォーマットは見かけ上シンプルです:分、時、日、月、曜日。それをマスターすることは、フィールドの位置を知るだけでなく、トークンがどう組み合わさるか、エッジケースがどこに潜んでいるか、そして10秒のバリデーションチェックが毎回その手間に値する理由を知ることを意味します。

覚えておくべき主要ルール:

  • フィールドを左から右に読む:分、時、日、月、曜日。
  • アスタリスクは「すべて」を意味します。プレースホルダーやデフォルトではありません。
  • 範囲、リスト、ステップは組み合わせることができますが、各フィールドは独立して評価されます。
  • 日と曜日は両方とも非ワイルドカードの場合、交差ではなく和集合を形成します。
  • 常にスケジューラのタイムゾーンを確認し、デプロイ前に次回実行をプレビューしてください。

Cronwiseはこの確認を高速にするために構築されています。式を貼り付け、説明を読み、実行を確認し、自信を持ってデプロイしましょう。Cronwiseのすべてのcron記事を閲覧して学び続けるか、ツールに直接ジャンプしましょう。