[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'

の様になってしまうようですが。

関連記事:
linux / プログラミングのおぼえがき

関連サイト:
cronでは「毎月第1月曜日に実行」ができない
crontab - Linux Square - @IT

おすすめ

2件のフィードバック

  1. /dev/null より:

    どうせなら fcron とかにすれば !dayand でも !dayor でも…

  2. /dev/null より:

    どうせなら fcron とかにすれば !dayand でも !dayor でも…

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です