Cron式ジェネレーター
ドロップダウンから分・時・日・月・曜日を選ぶだけでcrontabのスケジュールを作成 — わかりやすい日本語の説明文とよく使うプリセット付き。
1,014回閲覧
仕組み
cron式は、常に同じ順序で並んだ5つの空白区切りフィールドを使って繰り返しジョブをスケジュールします — 分・時・日(月内)・月・曜日です。各フィールドには値、または4種類の特殊文字のいずれかを指定できます。*は「すべての値」を意味し、*/15は「そのフィールドの最小値から15単位ごと」、1,15,30は明示的なリスト、1-5は両端を含む範囲を表します。左から右へ読むと、0 9 * * 1-5は「9時の0分に、月内の毎日、毎月、曜日1から5にかけて」という意味になり、つまり月曜から金曜の午前9時です。*/10 * * * *は終日10分ごとに実行され、0 0 1 * *は毎月1日の深夜0時に実行されます。
ドロップダウンからスケジュールを組み立てると、このツールが5つのフィールドを組み立て、その結果を平易な文章に翻訳するので、crontabファイルやクラウドスケジューラに貼り付ける前に内容を確認できます。よく使われるプリセット — 毎分、毎時、毎日決まった時刻に、平日のみ — は、人々が最も頻繁に求めるスケジュールをワンクリックで用意します。
知っておくべきこと
cronの意味論で最も大きな驚きは次の点です。日(月内)と曜日の両方が制限されている場合(どちらも*のままではない場合)、この2つはANDではなくORで結合されます。つまり0 0 15 * 5は「15日、ただしそれが金曜日である場合」を意味するのではなく、「毎月15日、または毎週金曜日」を意味し、これは多くの人が意図するよりもはるかに頻繁に実行されます。片方だけを気にしたい場合は、もう片方を*のままにしておいてください。
曜日の番号付けにも注意が必要です。ほとんどのcron実装では0と7の両方が日曜日を意味し、月曜日は1です。そして決定的に重要なのは、cronは常にサーバーに設定されたタイムゾーンで実行されるという点です — クラウドインフラでは一般にUTC — スケジュールを設定した人のローカルタイムゾーンではありません。そのため「午前9時」に設定したジョブが、ホストのタイムゾーンを確認するまでは想定と異なる現地時刻に実行されることがあります。GitHub Actionsのschedule:、AWS EventBridge、KubernetesのCronJobといったクラウドスケジューラは、いずれもこの同じ5フィールド構文を基盤としており、ベンダー固有の拡張(オプションの秒フィールド、曜日名の省略記法など)が加わることもあります。そのため、ここで組み立てたスケジュールはほとんど変換なしにこれらのプラットフォームへそのまま移行できます。
よくある質問
30秒ごとに何かを実行するにはどうすればいいですか?
従来のcronの最小単位は1分です。よくある回避策は2行を用意することです。1行は通常通り、もう1行はコマンドの前に`sleep 30 &&`を付けたものにします。あるいは秒単位に対応したsystemdタイマーを使う方法もあります。
9:00に設定したジョブがおかしな時刻に実行されたのはなぜですか?
ほとんどの場合、原因はタイムゾーンです。crontabはサーバーのローカル時刻で動作します(クラウド環境ではUTCであることが多いです)。ホスト上で`date`コマンドを実行して確認するか、対応している場合はCRON_TZを設定してください。
式を安全にテストするにはどうすればいいですか?
まずログ出力用のコマンドに向けてテストしましょう:`* * * * * date >> /tmp/cron-test.log`。実行間隔を確認できたら、実際のコマンドに差し替えます。また、crontabを実行するユーザーに必要なPATHが通っているかも確認してください — cronの実行環境は最小限に限られています。
日(月内)と曜日の両方が設定された場合はどうなりますか?
ANDではなくORで結合されます — `0 0 15 * 5`のようなスケジュールは、毎月15日「かつ」毎週金曜日に実行されるのではなく、たまたま15日に当たった金曜日だけでなくその両方の条件で実行されます。cron単体では両方の条件の「積(かつ)」を表現できません。その判定はジョブ自体の中で行う必要があります。
cronは夏時間(DST)を考慮しますか?
実装によって異なりますが、従来のcronは一般にDSTの切り替えを含むシステム時計のローカル時刻に従います。つまり「春の時計を進める」時間帯や「秋の時計を戻す」時間帯に設定されたジョブは、その日にゼロ回、または2回実行されることがあります。UTCに設定されたサーバーはこの問題を完全に回避できます。これは、多くの本番用スケジューラがデフォルトでUTCを使う理由の一つでもあります。
同じフィールドで範囲とステップを組み合わせることはできますか?例えば1日おきの平日を指定したい場合など。
はい — ステップはワイルドカードだけでなく範囲にも適用できます。曜日フィールドの`1-5/2`は「月曜日から金曜日の範囲内で2日ごと」を意味し、つまり月曜日・水曜日・金曜日になります。この範囲とステップを組み合わせた形式は、Vixie cronやsystemdを含むほとんどの最新のcron実装でサポートされていますが、最も古いPOSIX実装ではサポートされていない場合があるため、レガシー環境で頼る前に一度テストしておいてください。
関連ツール
問題を報告
Cron式ジェネレーター
コメント
まだコメントはありません — 最初のコメントを書いてみましょう!