開発 · 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フィールドの式はエラーになります。