バッチ処理やバックアップ、レポート送信など、決まった時刻にプログラムを自動実行する仕組みとして、cron(クーロン)は長く使われてきました。
Linuxのcrontabだけでなく、クラウドのスケジューラーやCIサービスでも、同じ「cron式」で実行時刻を指定できます。
この記事では、cron式の書き方と、運用で失敗しやすいポイントを解説します。
cron式の基本:5つのフィールド
標準的なcron式は、空白で区切られた5つのフィールドで構成されます。
分 時 日 月 曜日
| フィールド | 指定できる値 |
|---|---|
| 分 | 0〜59 |
| 時 | 0〜23 |
| 日 | 1〜31 |
| 月 | 1〜12 |
| 曜日 | 0〜7(0と7は日曜) |
使える記号
*:すべての値(毎分、毎時など),:複数の値を列挙(例:0,30は0分と30分)-:範囲(例:1-5は1〜5)/:間隔(例:*/15は15ごと)
よく使う記述例
| cron式 | 実行タイミング |
|---|---|
* * * * * |
毎分 |
*/5 * * * * |
5分ごと |
0 * * * * |
毎時0分 |
0 3 * * * |
毎日午前3時 |
30 9 * * 1-5 |
平日の午前9時30分 |
0 0 1 * * |
毎月1日の午前0時 |
0 18 * * 5 |
毎週金曜日の午後6時 |
運用で失敗しやすいポイント
1. タイムゾーン
cronはサーバーやサービスに設定されたタイムゾーンで動きます。
クラウドのスケジューラーやコンテナでは、既定がUTCになっていることが多く、日本時間(JST、UTC+9)の感覚で設定すると9時間ずれます。
「毎朝9時(JST)」にしたいなら、UTCでは0時です。
タイムゾーンを指定できるサービスでは、明示的に Asia/Tokyo を設定すると安全です。
2. 「日」と「曜日」の両方を指定したときの挙動
伝統的なcronでは、日と曜日の両方に * 以外を指定すると、「どちらかに一致すれば実行」(OR条件)になります。
たとえば 0 9 13 * 5 は「13日」または「金曜日」に実行され、「13日の金曜日」だけではありません。
実装によって挙動が違う場合があるため、使用するサービスの仕様を確認してください。
3. 実行時間が間隔より長くなる
5分ごとの処理に10分かかると、前の処理が終わる前に次が始まり、重複実行になります。
データの二重更新やリソース枯渇の原因になるため、ロックの取得や、実行中は起動しない制御を入れておきましょう。
4. 時刻が集中する
多くの人が「毎時0分」「毎日0時」に設定するため、外部APIやサーバーの負荷が集中しがちです。
処理に厳密な時刻の指定が不要なら、7 * * * * のように少しずらすと、負荷分散になります。
5. 失敗に気付けない
cronは、実行が失敗しても通知してくれません。
ログの保存先を決める、失敗時に通知する、監視サービスで「実行されたこと」を確認する、といった仕組みを用意しておくことが大切です。
6. 環境変数とパス
cronから実行されるシェルは、ログイン時の環境変数を引き継ぎません。
コマンドは絶対パスで書く、必要な環境変数はcrontabや実行スクリプトの中で設定する、といった対応が必要です。
書いたcron式を確認する
cron式は一見して分かりにくく、書き間違いに気づきにくいものです。
設定する前に、「次回の実行時刻」を一覧で確認できるツールを使えば、意図どおりに動くかを事前に検証できます。
まとめ
cron式自体は5つのフィールドと数個の記号だけの単純な書式ですが、運用ではタイムゾーン、重複実行、失敗の検知といった点が問題になります。
式を書いたら次回実行時刻を確認し、ログと通知を整えておくことを習慣にしましょう。