7
8

More than 5 years have passed since last update.

crontabで特定年月日に実行させようとして失敗

Last updated at Posted at 2016-01-04

経緯

crontabで特定の日時に一回だけ実行したいと思うことはあると思う。普通なら

11 7 24 12 * /usr/local/bin/hoge

みたいに書く訳だけれども、毎年その日が変わる場合なんかだと、フェールセーフとして、曜日を入れたくなる1
今回は、月~金の休日明けに何か2処理を実行させたかった。

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が実行されて平日稼働を始めるサーバ。
他の人6が緊急に対応してくれて、事は収拾。

原因

休み明けに手動で/usr/local/bin/hogeを動かした7あと、調べたらcrontabにこっそり書いてあるのを見つけて愕然。

注 意: コマンド実行の日は 2 つのフィールドで指定できる ― 月内日および曜日である。もし両方のフィールドが制限指定 (* 以外) であると、いずれかのフィールドが現在時刻と合った時にコマンドが実行される。例え ば
‘‘30 4 1,15 * 5’’
とすると、毎月 1 日と 15 日および毎週金曜日の午前 4:30 にコマンドが実行される。

すなわち、12/31は、木曜日(THU)なので、crontab 1行目にマッチしていたと。
各フィールドはAND条件とばかり思ってた…まさかOR条件な場合があるとは…

教訓

知っているコマンドでもmanは隅々読んだほうがイイ!



  1. 普通は毎年同じ日でも曜日が変化するから、少しでも間違って実行される可能性を減らすという考えですね。 

  2. 何かは企業秘密。 

  3. まぁ年の瀬で来年は楽をしようとした訳で。 

  4. 過去、頭にゼロを付けて桁揃えしたら8進数になってという別の失敗談はさておき。 

  5. まぁ、大晦日くらいお休みさせてください。 

  6. 自分で対応できなくてゴメンナサイ。 

  7. そりゃ訳が判らない動きされたcrontabは停止してしまうよね。 

7
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8