[Raspberry Pi] cron で「第 X 曜日の前日」に実行3

cron で「第3土曜日の前日」の実行をし、それがうまくいかなかったことを書いた。

[Raspberry Pi] cron で「第 X 曜日の前日」に実行 – with a Christian Wife
https://wacw.cf/2018/12/18/cron-the-day-before-x-th-week/

[Raspberry Pi] cron で「第 X 曜日の前日」に実行2(失敗) – with a Christian Wife
https://wacw.cf/2018/12/22/cron-the-day-before-x-th-week-2/

上記のやり方だとまた金曜日に cron のジョブが実行されてしまった。あれれ、毎週金曜日に実行されてしまう!?

いろいろ調べた結果、やっと謎が解けた。

それは cron ではジョブの指定で、同時に指定された曜日と日付は「AND」ではなく「OR」の意味になってしまうのだ(なんでこんな仕様になっているのか・・・)。

改めてこれまでの設定を見てみよう(第3土曜日の前日 6:50 に実行する場合)。

土曜日から始まらない月の「第3土曜日の前日」
50 6 15-20 * * [ "$(date '+\%w')" -eq 5 ] && [処理内容]

土曜日から始まる月の「第3土曜日の前日」
50 6 14 * 5 [処理内容]

これら2つのジョブを登録していた。

そう、犯人は2つ目のジョブだ。これでは「14 日金曜日のみ(14 日かつ金曜日)」実行されるのではなく「14 日、あるいは毎週金曜日」実行されてしまう。AND ではなく OR になっている。だから以下のように直せばいい。

50 6 14 * * [ "$(date '+\%w')" -eq 5 ] && [処理内容]

つまり 14 日と日付を指定しているけど、曜日は * にしておき、計算式上で金曜日だけ選ばれるようにしている。

これで今度こそうまくいくはず!

参考:
cron – cronで第1営業日を指定する方法はないでしょうか?|teratail
https://teratail.com/questions/119072

[linux] crontab では 毎月特定週の特定曜日の実行はできない – Windows 2000 Blog
http://blog.livedoor.jp/blackwingcat/archives/1029569.html

crontab の日付指定、あなたの理解は間違っている – 頭ん中
https://www.msng.info/archives/2013/12/crontab-day.php

13日の金曜日の指定はダメ! crontabでは特定の「日付かつ曜日」は実行できない パソコン鳥のブログ/ウェブリブログ
https://vogel.at.webry.info/201511/article_1.html