【Linux】crontabで第何曜日にタスク実行する方法

スポンサーリンク
cron
スポンサーリンク

「第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 初版公開

コメント

タイトルとURLをコピーしました