Yueseryueser.com

← ガイド一覧

cron 式ガイド:5 つのフィールドと次回実行

式を貼って次回以降の実行時刻を見るほうが、ドキュメントと見比べてアスタリスクを数えるより速いです。公開前に一度通しておけば、本番で動いていなかったという事故の多くは防げます。

ツールを開く:Cron Parser

先に解析しておく価値がある場面

他人の crontab を引き継ぐとき、判断に迷うのは意図です。0 3 * * 1-5 は毎日 3 時なのか、平日の 3 時なのか。計算してみないと変更できません。自分で書くときも同じで、*/n や範囲、リストを組み合わせた式は、境界が正しいか目で確認しづらいです。

「ときどき動かない」という調査もよくあります。原因は式の中にあることが多く、月と日の組み合わせで数か月飛んだり、時差が 8 時間あったり、2 月に 31 日が来なかったりします。次回の実行時刻を並べれば、すぐに見えます。

5 つのフィールドの読み方と、つまずきやすい点

順に、分 0-59、時 0-23、日 1-31、月 1-12、曜日 0-7(0 と 7 はどちらも日曜)です。アスタリスク、*/n、a-b、a,b、そして 1-5,0 のような組み合わせが使えます。*/n は最小値から n 個刻みで選ぶ、つまり n で割り切れる値という意味で、「n 単位ごとに 1 回」ではありません。分のフィールドでは同じ結果になりますが、1-31 の日では */2 が奇数日になります。

最も誤解されるのが日と曜日の組み合わせです。ほとんどの Linux が採用する Vixie cron では、両方とも制限されている(どちらもアスタリスクでない)場合、OR として扱われます。0 0 1 * 1 は毎月 1 日と毎週月曜に実行され、「1 日かつ月曜」ではありません。AND を表したいときは、片方をアスタリスクにするか、スクリプト側で日付を判定します。

限界:cron は起動するだけで、完了は保証しない

cron は遡って実行しません。3 時に電源が切れていて 3 時半に起動した場合、その回は失われます。実行時間が間隔を超えても待たず、次のプロセスを起動します。同じデータを 2 つのプロセスが書き換える事故は、たいていここで起きます。長い処理は flock で排他するか、ロック付きのジョブキューに移してください。

このツールは標準の 5 段のみを解析します。@daily や @reboot のマクロ、秒のフィールド、Quartz の L・W・# には対応していません。秒単位の精度、実行漏れの補完、実行履歴が必要なら、systemd timer やジョブキュー、スケジューラサービスを使ってください。

よくある質問

cron で日と曜日を同時に指定するとどうなりますか?

標準の Vixie cron では、両方がアスタリスクでない場合に OR として扱われます。どちらかを満たせば実行されます。0 0 1 * 1 は毎月 1 日と毎週月曜で、「1 日かつ月曜」ではありません。AND にしたいときは片方をアスタリスクにするか、スクリプト内で日付を判定してください。

cron が思った時間に動かないときは何を確認しますか?

順に 4 点です。式が意図した時刻を指しているか(この画面の次回実行時刻と照合)、サーバーのタイムゾーンが想定どおりか、PATH や作業ディレクトリがログインシェルと違うためコマンドを絶対パスで書く必要がないか、そして cron のログに実行記録があるか。

31 日指定のジョブが 2 月に動かないのはなぜですか?

2 月に 31 日がないからです。日に 31 を書くと 1、3、5、7、8、10、12 月だけが対象になり、それ以外の月はエラーも出さずに飛ばされます。月末の処理は 28 日にするか、スクリプトで月末かどうかを判定してください。

関連ツール:Cron Parser