はじめに
cron の基本機能では隔週で実行する方法が無いため、一工夫が必要です。
いくつかのサイトで解説されていますが、実際どうしてそんな書き方をしているか解説が無いことが多かったので、細かく記載してみました。
cron の基本的な書き方
cron の編集方法は大きく分けて2種類。
まずは crontab -e で crontab を直接編集するパターン。
これは編集に入るまでが非常に早い点が大きなメリット。
一方でユーザ毎に crontab があるため、複数人が管理するサーバだと分かりにくいと言うデメリットがある。
実ファイルは /etc/crontab ではなく /var/spool/cron 配下に保存されている。
もう一つのパターンは /etc/cron.d/ 配下にファイルを保存する方法。
/etc/cron.d/ 配下に保存するファイル名はなんでもよく、そのファイルの中に cron の設定を書く。
個人的には、こちらの方がユーザ問わず後から確認しやすくていいと思う。
設定の書き方は crontab に書く場合は以下。
* * * * * [コマンド]
/etc/cron.d/ 等にファイルを置く場合は以下のように実行するユーザを指定する。
* * * * * [ユーザ] [コマンド]
パラメータはそれぞれ以下に習って記載する。
「*」の位置(左端から) | パラメータ | 指定できる数字 | 備考 |
1番目 | 分 | 0~59 | |
2番目 | 時 | 0~23 | |
3番目 | 日 | 1~31 | |
4番目 | 月 | 1~12 | |
5番目 | 曜日 | 0~7 | 0と7は日曜日 |
隔週実行の書き方
例として 隔週日曜日(0) の 23:30 に OS を再起動する場合は以下のようになる。
cron.d 配下で設定する場合
30 23 * * 0 root test $(expr $(date '+%W') % 2) -eq 0 && reboot
crontab に書く場合
30 23 * * 0 test $(expr $(date '+\%W') \% 2 ) -eq 0 && reboot
解説
まずコマンド部分は以下となる。
test $(expr $(date '+%W') % 2) -eq 0 && reboot
更に隔週で実行する判定部分は以下。
test $(expr $(date '+%W') % 2) -eq 0
上記で使われているコマンドについて順に解説します。
test コマンド
以下のように書くと引数1 と 引数2 が同じとき && に続くコマンドを実行できる。
test 引数1 eq 引数2 && 実行するコマンド
expr コマンド
expr を使って以下のように書くと引数1 を引数2で 割った余りが出力される。
expr 引数1 % 引数2
例えば 3 % 2 であれば「1」、4 % 2 であえば「0」、5 % 2 であれば「1」となる
date コマンド
日付を表示するコマンド。
「date ‘+%W’」 で実行すると「10進数で表す週の通し番号(00〜53)。その年の最初の月曜日を週の最初の日とする」が表示される。
今年の何回目の週になるのか数字で出力される。
実際にどのように結果がでるか確認するためコマンドを実行してみる。
2022/8/17 だと 33週目であることが分かる。
# date
2022年 8月 17日 水曜日 11:27:40 JST
#
# date '+%W'
33
33 を 2 で割ると余りが 1 となる。
# expr $(date '+%W') % 2
1
2022/8/28 だと 34週目であることが分かる。
# date --date "11 days"
2022年 8月 28日 日曜日 11:26:36 JST
# date --date "11 days" '+%W'
34
34 を 2 で割ると余りが 0 となる。
# expr $(date --date "11 days" '+%W') % 2
0
2022/8/14 だと 32週目であることが分かる。
# date --date "3 days ago"
2022年 8月 14日 日曜日 11:27:05 JST
# date --date "3 days ago" '+%W'
32
32 を 2 で割るもちろん余りが 0 となる。
# expr $(date --date "3 days ago" '+%W') % 2
0
つまり以下はtest コマンドでその年の偶数の週だった場合にコマンドを実行することになる。
test $(expr $(date '+%W') % 2) -eq 0
最後に && の後に実行したいコマンドを書く。
test $(expr $(date '+%W') % 2) -eq 0 && reboot
まとめ
そこまで利用する機会が多くないので、自分のメモとしても記録。
パッと見ではややこしい書き方でも、分解していくと怖いことは無い。
理解してから利用すると安心して使えるし、勉強にもなる。
コメント