cronjobから特定の日時を除外

cronjobから特定の日時を除外

私は、ジョブが毎月第二、第四日曜日の午前1時から午前3時までを除いて、毎日、毎月、毎分、毎時間実行する必要があるという要件でcronジョブをスケジュールしようとしています。

私たちができる方法はありますか?私は成功せずに以下の方法を試してみました。

* 0-1,3-23 1-3,5-17,19-31 * 1-6

答え1

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

スクリプトの先頭に追加します。

答え2

dcronを使用している場合は、除外したい期間全体で実行されるジョブを設定できます。

# 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

その後、昼寝時間タスクに「依存」するようにターゲットタスクを設定できます。

# crontab
* * * * * FREQ=1m AFTER=naptime/1m /path/to/job.sh

~からスケジュールされたタスク(1):

ジョブは、他のジョブが正常に完了するまで「依存」または待つことができます。次のcrontabを考えてみましょう。

* * * * * ID=job4 FREQ=1d first_command
* * * * * ID=job5 FREQ=1h AFTER=job4/30m second_command

ここでjob5が実行されるたびにjob4が次の30分(30m)以内に実行されるようにスケジュールされている場合、job5は最初に成功した完了を待ちます。

(job4が正常に完了しない場合はどうなりますか?job4が終了コードEAGAINに返された場合、job5は1時間以内に再試行しなくてもjob4が再試行されるまで待ちます。job4がゼロ以外の終了コードとして返されます。場合、job5はキューから削除され、実行されません。)

答え3

まず、1分ごとにスクリプトを実行します。

* * * * * /usr/local/script.sh

次に、次の場合にすぐに終了するようにロジックを挿入します。

  1. 第二、第四日曜日または
  2. 午前1時から午前3時まで

このスクリプト例は、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

関連情報