「第2水曜日にだけ実行させたい」という要件をcrontabで解決する
仕事で
- 1月と7月の第2水曜日のAM2:05に1号機の特定プロセスをリブートする
1月と7月の第3水曜日にAM2:05に2号機の特定プロセスをリブートする
という必要があったのでcrontabで実現方法を考える。
実際の設定
#1号機
5 2 8-14 1,7 * root [ $(date "+\%w") -eq 3 ] && XXX_Reboot
#2号機
5 2 15-21 1,7 * root [ $(date "+\%w") -eq 3 ] && XXX_Reboot
解説
cronの仕様だけだと第○曜日の指定はできない
cronは、左端から「分」「時」「日」「月」「曜日」「実行内容」と設定することになっている。
カラム | 実行頻度 | 指定可能パラメータ | 備考 |
1番目 | 分 | 0-59 | |
2番目 | 時 | 0-23 | |
3番目 | 日 | 1-31 | 曜日指定と同時指定した場合、条件判定は 「かつ」ではなく「または」となってしまう |
4番目 | 月 | 1-12 | |
5番目 | 曜日 | 0-7 ※0と7は日曜日 | sun~satの略称曜日でも指定可 曜日指定と同時指定した場合、条件判定は 「かつ」ではなく「または」となってしまう |
6番目 | 実行内容 | - |
上記の通り、cronのパラメータだけだと「第?曜日」の指定が難しい。
※日カラムと曜日カラムで「かつ」で絞れないため
なので、以下のような発想で設定する。
第1○曜日は必ず1~7日のいずれかになる。
第2○曜日は必ず8~14日のいずれかになる。
同様に第3○曜日、第4○曜日も7日間範囲で絞り込める。
つまり、「第2水曜日にだけ実行したい」場合
8~14日の毎日実行し、当日が水曜日かどうか判定をコマンド部分で行い、水曜日であれば後続タスク(ここではリブート)を実行するようにすればよい。
当日が水曜日の時だけ後続タスクを実行するコマンド部分
「&&」で2つのコマンドをつなげると「1つ目のコマンドが正常終了した場合に2つ目のコマンドを実行する」ように制御できる。
なので、当日が水曜日の時だけ後続タスクを実行するコマンドは以下の通り
[ $(date "+\%w") -eq 3 ] && XXX_Reboot
青ラインが曜日判定
赤ラインがコマンドの接続
黄色ラインが後続タスク(実際に実行させたいコマンド)
$(date "+\%w")で当日が何曜日かを出し、
eq = 3(イコール水曜日の意)の場合が正常終了。
なので、水曜日だけ&&後ろのコマンドが実行される。
これでcrontabで第何曜日にタスク実行をコントロールすることが可能になった。
改版履歴
2021/02/08 初版公開
コメント