日時より複雑な条件でcronを実行する

ALL
スポンサーリンク

複雑な条件で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

コメント