経緯
crontabで特定の日時に一回だけ実行したいと思うことはあると思う。普通なら
11 7 24 12 * /usr/local/bin/hoge
みたいに書く訳だけれども、毎年その日が変わる場合なんかだと、フェールセーフとして、曜日を入れたくなる1。
crontabの設定
ということで、2015/123に以下のような設定を追加。
05 04 24 12 thu /usr/local/bin/hoge
05 04 04 01 mon /usr/local/bin/hoge
05 04 12 01 tue /usr/local/bin/hoge
05 04 12 02 fri /usr/local/bin/hoge
05 04 22 03 tue /usr/local/bin/hoge
05 04 02 05 mon /usr/local/bin/hoge
05 04 06 05 fri /usr/local/bin/hoge
05 04 19 07 tue /usr/local/bin/hoge
05 04 12 08 fri /usr/local/bin/hoge
05 04 20 09 tue /usr/local/bin/hoge
05 04 23 09 fri /usr/local/bin/hoge
05 04 11 10 tue /usr/local/bin/hoge
05 04 04 11 fri /usr/local/bin/hoge
05 04 24 11 thu /usr/local/bin/hoge
05 04 26 12 mon /usr/local/bin/hoge
05 04 24 12 thu /usr/local/bin/hoge
こんな感じ4に設定して一安心だったのだが……。
12/31の青天の霹靂
大晦日に会社もお休み5の中、突然のトラブル発生。
原因
休み明けに手動で/usr/local/bin/hogeを動かした7あと、調べたらcrontabにこっそり書いてあるのを見つけて愕然。
注 意: コマンド実行の日は 2 つのフィールドで指定できる ― 月内日および曜日である。もし両方のフィールドが制限指定 (* 以外) であると、いずれかのフィールドが現在時刻と合った時にコマンドが実行される。例え ば
‘‘30 4 1,15 * 5’’
とすると、毎月 1 日と 15 日および毎週金曜日の午前 4:30 にコマンドが実行される。
すなわち、12/31は、木曜日(THU)なので、crontab 1行目にマッチしていたと。
各フィールドはAND条件とばかり思ってた…まさかOR条件な場合があるとは…
教訓
知っているコマンドでもmanは隅々読んだほうがイイ!