毎月第2日曜日と第4日曜日の午前1時から午前3時を除いて、毎日、毎月、毎分、毎時実行する必要があるcronジョブをスケジュールしようとしています。
それを行う方法はありますか?私は以下を使用してみましたが、運がありません:
* 0-1,3-23 1-3,5-17,19-31 * 1-6
cron
だけでは、このような特定の時間例外を構成することはできません。代わりに、これらの例外が満たされたときにスクリプトが実行されないように、スクリプト内でそれを確認する必要があります。これは、たとえば次のようになります。
#!/bin/sh
# If it's sunday ...
if [ "$(date +%u)" = "7" ]; then
# and it's the 2nd or ...
if ( [ "$(date +%e)" -gt "7" ] && [ "$(date +%e)" -lt "15" ] ) || \
# or the 4th sunday of the month ...
( [ "$(date +%e)" -gt "21" ] || [ [ "$(date +%e)" -lt "29" ] ); then
# look if it's between 1 and 3 AM ...
if [ "$(date +%k)" -ge "1" ] && [ "$(date +%k)" -le "3" ]; then
# exit the script if all of the above have met
exit
fi
fi
fi
# normal script continues here
これをスクリプトの先頭に追加します。
まず、スクリプトを毎分実行します。
* * * * * /usr/local/script.sh
次に、ロジックをその中に入れて、次の場合はすぐに終了するようにします。
このサンプルスクリプトは、ncal
とawk
に依存しています。
#!/bin/bash
second_sunday=$(ncal -h | awk '/Su/ {print $(NF-2)}')
fourth_sunday=$(ncal -h | awk '/Su/ {print $(NF)}')
if [[ $(date +'%d') -eq $second_sunday ]] || [[ $(date +'%d') -eq $fourth_sunday ]]
then exit 0
else
if [[ $(date +'%H') -ge 01 ]] && [[ $(date +'%H') -lt 04 ]]
then exit 0
fi
fi
実行できることは、除外する期間の全期間中に実行するジョブを設定することです。
# crontab
# MIN HOUR DAY MONTH DAYOFWEEK COMMAND
0 1 1-7,15-21 * 7 ID=naptime /path/to/naptime.sh
naptime.sh:
#!/bin/sh
# Exit unless Sunday
if [ $(date +%u) -ne 7 ] ; then
exit
fi
sleep 2h
次に、naptimeジョブに「依存」するようにターゲットジョブを設定できます。
# crontab
* * * * * FREQ=1m AFTER=naptime/1m /path/to/job.sh
から crontab(1) :
Jobs can be made to "depend" on, or wait until AFTER other jobs have successfully completed. Consider the following crontab:
* * * * * ID=job5 FREQ=1h AFTER=job4/30m second_command
Here, whenever job5 is up to be run, if job4 is scheduled to run within the next 30 minutes (30m), job5 will first wait for it to successfully complete.