[linux] crontab では 毎月特定週の特定曜日の実行はできない
先日の 記事「linux / プログラミングのおぼえがき」で動作が未検証でかけなかったのですが、動作検証ができたので記事にします。
crontab で
30 5 22-28 * 0 Command |
の様に書くと毎週第4日曜日(22~28日が日曜日)の時にCommand が実行できそうに見えますが、実は
『22~28日』と『日曜日』の両方実行されるという、OR 処理になってしまいます。
んで、どうすればいいかというと、
30 5 22-28 * * /usr/bin/test $( date +%w ) -eq 0 && Command |
の様にすれば、/usr/bin/test $( date +%w ) -eq 0 && Command の部分が 毎月 22~28日に実行され、 /usr/bin/test $( date +%w ) -eq 0 で日曜日だけ Command が実行できるようになります。
たまに、TZ=JST-33 date のように 一時的な環境変数 TZ を使えばいいと記述されているサイトもありますが、 JST は 絶対値 24を超えると無効なので、前日を表現する TZ=JST+15 date では使えますが、翌日を表現する TZ=JST-33 date は使用できません
たとえば、月末 6:15 にだけ処理するプログラムは
15 6 28-31 * * /usr/bin/test $( date -d '1 days ago' +%d ) -eq 1 && Command |
のように書けます
一部の古い linuxだと、-dオプションは直接の日付指定しか対応してないようで、
date: invalid date `1 days ago' |
の様になってしまうようですが。
どうせなら fcron とかにすれば !dayand でも !dayor でも…
どうせなら fcron とかにすれば !dayand でも !dayor でも…