複雑な条件でcronを実行する場合の指定方法です。
2019.9.19 修正
cronでの実行例で、%を \% に修正しました。
月末に実行する
月によって月末の日付が異なりますので、次のようにして、翌日が1日の場合(=月末)に実行します。
0 0 28-31 * * /usr/bin/test $(date -d '+1 day' +\%d) -eq 1 && COMMAND
参考:[linux]月末にcronを実行する – hello-world.jp.net
指定の日付&曜日に実行する
cron では、特定の「日付かつ曜日」の指定はできないので、コマンドで工夫が必要です。
13日の金曜日の指定はダメ! crontabでは特定の「日付かつ曜日」は実行できない: パソコン鳥のブログ
X日がY曜日の場合に実行するには、次のようにします。
(Yは、曜日を数字 0-7 で指定します。0 と 7 は日曜日です)
0 0 X * * /usr/bin/test $(date +\%w) -eq Y && COMMAND
または次のようにします。
0 0 * * Y /usr/bin/test $(date +\%d) -eq X && COMMAND
第X Y曜日に実行する
例えば、第3水曜日に実行、などをする場合です。
次のようにします。
0 0 XX * * /usr/bin/test $(date +\%w) -eq Y && COMMAND
XX は、第X Y曜日 の X の値によって、次の値を指定します。
1:1-7
2:8-14
3:15-21
4:22-28
5:29-31
Y は、曜日を数字 0-7 で指定します。0 と 7 は日曜日です。
参考:crontabで第?曜日にタスクを実行する方法 – ソフラボの技術ブログ
最終Y曜日に実行する
最終Y曜日の場合に実行するには、次のようにします。
(Yは、曜日を数字 0-7 で指定します。0 と 7 は日曜日です)
1週間後の月が現在の月と異なっている場合が、最終Y曜日だと判断できます。
0 0 * * Y /usr/bin/test $(date '+\%m') -ne $(date -d '+7 day' '+\%m') && COMMAND
参考:crontabの書き方 | server-memo.net
祝日/休日に実行する
次の記事の「祝日/休日の判定方法」の個所を参照して下さい。
cronで利用すると便利な、祝日や平日(営業日)かの判定方法: パソコン鳥のブログ
平日(営業日)に実行する
次の記事の「平日(営業日)の判定方法」の個所を参照して下さい。
cronで利用すると便利な、祝日や平日(営業日)かの判定方法: パソコン鳥のブログ
月の最初の平日に実行する
下記の「準備」の箇所に従って、holidays.csv を作成しておきます。
cronで利用すると便利な、祝日や平日(営業日)かの判定方法: パソコン鳥のブログ
次のスクリプトを作成します。
is_firstweekday.sh
#!/bin/bash first_weekday_db=-1 for((i = 0 ; i >= -30 ; i--)); do dd=$(($i-0)) t=`date -d "+$dd day" +%-d` if [ $t -ge 28 ]; then break fi grep `date -d "+$dd day" "+%Y/%-m/%-d"`, holidays.csv > /dev/null 2>&1 && continue tmp=`date -d "+$dd day" +%w` if [ $tmp -eq 0 -o $tmp -eq 6 ]; then continue fi first_weekday_db=$i done if [ $first_weekday_db -eq 0 ]; then exit 0 else exit 1 fi
cronで次のようにします。
0 0 * * * /bin/bash is_firstweekday.sh && COMMAND
月の最後の平日に実行する
下記の「準備」の箇所に従って、holidays.csv を作成しておきます。
cronで利用すると便利な、祝日や平日(営業日)かの判定方法: パソコン鳥のブログ
次のスクリプトを作成します。
is_lastweekday.sh
#!/bin/bash last_weekday_da=-1 for((i = 0 ; i <= 30 ; i++)); do dd=$(($i+0)) t=`date -d "+$dd day" +%-d` if [ $t -eq 1 ]; then break fi grep `date -d "+$dd day" "+%Y/%-m/%-d"`, holidays.csv > /dev/null 2>&1 && continue tmp=`date -d "+$dd day" +%w` if [ $tmp -eq 0 -o $tmp -eq 6 ]; then continue fi last_weekday_da=$i done if [ $last_weekday_da -eq 0 ]; then exit 0 else exit 1 fi
cronで次のようにします。
0 0 * * * /bin/bash is_lastweekday.sh && COMMAND
コメント