5つのフィールド
cron式は空白で区切った5つのフィールドでできていて、スケジューラーにタスクをいつ実行するかを伝えます。左から順に:
| 分 | 0-59 |
| 時 | 0-23 |
| 日 | 1-31 |
| 月 | 1-12 |
| 曜日 | 0-6(日曜 = 0) |
現在の時刻がすべてのフィールドに一致したときに、タスクが実行されます。
特殊文字
*すべての値。,リスト:1,15は1日と15日。-範囲: 最後のフィールドの1-5は月曜から金曜。/間隔: 分のフィールドの*/10は10分ごと。
よく使うスケジュール
*/5 * * * * | 5分ごと |
0 * * * * | 毎時0分 |
0 0 * * * | 毎日0時 |
30 8 * * 1-5 | 平日の8時30分 |
0 0 1 * * | 毎月1日の0時 |
0 3 * * 0 | 毎週日曜の3時 |
どんな式でもcron式の解説に貼り付けると、意味を言葉で読めて、次の実行日時もわかります。
よくある落とし穴
- タイムゾーン: cronはサーバーの時計を使い、多くの場合UTCです。日本時間の9時に動かすなら、UTCでは0時です。
- 日と曜日の両方: 両方を指定すると、どちらかに一致すれば実行されます。両方に一致したときではありません。
- 秒: 標準のcronには秒のフィールドがありません。QuartzやSpringなど一部のシステムは先頭に秒を加え、6つのフィールドになります。
見た目どおりに動かない式
| 式 | 意図 | 実際の実行 |
|---|---|---|
0 9 1-7 * 1 | 第1月曜の9:00 | 毎月1〜7日の9:00と、毎週月曜の9:00 |
*/15 9-17 * * 1-5 | 9時〜17時に15分ごと | 平日の9:00〜17:45。17時台も含む |
0 0 31 * * | 毎月末日 | 31日がある7つの月だけ |
0 0 29 2 * | 年1回 | うるう年だけ |
第1月曜に動かしたいなら、1〜7日に実行してスクリプトの中で曜日を確かめます。
省略記法
多くのcronは別名を受け付けます。@hourly、@daily、@weekly、@monthly、@yearly、そして起動時に1回だけ実行する @reboot です。
夏時間
日本には夏時間がありませんが、夏時間のある国の現地時刻で動くサーバーでは、1:00〜3:00に設定したジョブが時計を進める夜に飛ばされたり、戻す夜に2回実行されたりします(cronの実装によります)。大事なジョブはその時間帯を避けるか、サーバーをUTCで運用しましょう。