開発 · 4分で読めます ·

cron式をやさしく解説、すぐ使える例10選

5つのフィールド、4つの記号、そしてタイムゾーンの落とし穴。コピーして使える例で、cronのスケジュールの読み方と書き方を学びましょう。

cronは世界中のサーバーでバックアップやレポート、クリーンアップを動かしているスケジューラーで、その書式はGitHub ActionsやKubernetesのCronJob、多くのクラウドのスケジューラーでも使われています。スケジュールはスペースで区切った5つのフィールドです。

┌ 分 (0-59)
│ ┌ 時 (0-23)
│ │ ┌ 日 (1-31)
│ │ │ ┌ 月 (1-12)
│ │ │ │ ┌ 曜日 (0-6, 0 = 日曜)
* * * * *

4つの記号

* はすべての値を意味します。カンマはリスト(1,15)、ハイフンは範囲(1-5)、スラッシュは間隔(*/15 = 15ごと)を表します。この4つでほとんどのスケジュールが書けます。

10の例

*/5 * * * *       5分ごと
0 * * * *         毎時0分
0 9 * * *         毎日9:00
30 2 * * *        毎晩2:30
0 9 * * 1-5       平日の9:00
0 18 * * 5        毎週金曜18:00
0 0 1 * *         毎月1日の0:00
0 0 1 1 *         年に1回、1月1日
0 */6 * * *       6時間ごと
15 8,12,17 * * *  毎日8:15、12:15、17:15

落とし穴1:日と曜日

両方のフィールドを指定すると、従来のcronはどちらか一方が一致したときに実行します。0 0 1 * 1 は「1日が月曜のとき」だけでなく、毎月1日と毎週月曜の両方に実行されます。

落とし穴2:タイムゾーン

cron自体にはタイムゾーンがありません。ジョブは実行するマシンやサービスのタイムゾーンで動き、それはUTCであることが多いです。UTCのサーバーで 0 9 * * * と設定すると9:00 UTCに実行され、あなたの地域では数時間前後にずれることがあり、夏時間でさらにずれることもあります。

落とし穴3:実行の重複と取りこぼし

cronは前回の実行が終わっていてもいなくても、予定の時刻にジョブを開始します。5分ごとに実行するバックアップが7分かかれば、いずれ2つが同時に動きます。長いジョブはロックで包む(Linuxならflockで1行です)か、並行して実行しても安全にしておきましょう。また、cronは遅れを取り戻しません。02:30にマシンが止まっていれば、その夜の02:30のジョブは単に実行されません。

*/5 * * * *  flock -n /tmp/backup.lock /usr/local/bin/backup.sh

省略記法と細かな違い

多くのcron実装では、5つのフィールドの代わりに@hourly、@daily、@weekly、@monthly、@rebootといった省略記法が使えます。ほとんどの実装で日曜日は0でも7でも書け、MONやJANのような名前も使えます。細部はプラットフォームによって違うので、ジョブを実行するシステム、特にマネージドなクラウドのスケジューラーのドキュメントを確認しましょう。

出力はどこへ行く?

cronは既定でジョブの出力をローカルユーザーにメールで送ります。ほとんどのサーバーでは、それは出力が消えてしまうことを意味します。失敗したジョブが痕跡を残すよう、出力をログファイルやログ基盤にリダイレクトしましょう。

30 2 * * *  /usr/local/bin/report.sh >> /var/log/report.log 2>&1

デプロイ前に確認

4Devのcron式エクスプレイナーに式を貼り付けると、スケジュールを分かりやすい言葉で読み上げてくれます。標準の5フィールド形式に対応しており、QuartzやSpringのような秒や年を含む6〜7フィールドの式はエラーになります。

cron式エクスプレイナーを開く

LinkedInXFacebook