毎月第 1 月曜日に cron ジョブを実行しますか?

毎月第 1 月曜日に cron ジョブを実行しますか?

毎月第一月曜日の8時30分にcronからジョブを実行したいのですが、cronのWikipediaのページにはこう書かれています。

通常、ジョブは時間/日付指定フィールドがすべて現在の時間と日付に一致する場合に実行されますが、例外が1つあります。「月日」と「曜日」の両方が制限されている場合(「*」ではない)、どちらか「月日」フィールド(3)または「曜日」フィールド(5)は現在の日付と一致する必要があります。

(強調は筆者)

つまり、その月の最初の月曜日はできず、その月の最初の日(または何日か)しかできないということですか? 回避策が思いつきません。

答え1

条件を実際の crontab コマンドに組み込むことができます (一般的な方法):

[ "$(date '+%u')" = "1" ] && echo "It's Monday"

ロケールが EN/US の場合は、文字列を比較することもできます (最初の回答):

[ "$(date '+%a')" = "Mon" ] && echo "It's Monday"

ここで、この条件が月の最初の 7 日のうちの 1 日に当てはまる場合、その月の最初の月曜日になります。ただし、crontab ではパーセント構文をエスケープする必要があることに注意してください (一般的な方法)。

0   12  1-7 *   *   [ "$(date '+\%u')" = "1" ] && echo "It's Monday"

ロケールが EN/US の場合は、文字列を比較することもできます (最初の回答):

0   12  1-7 *   *   [ "$(date '+\%a')" = "Mon" ] && echo "It's Monday"

echo実際に実行したいコマンドに置き換えてください。同様のアプローチあまりにも。

答え2

私のコンピューターはスペイン語に設定されていますが、この方法は私にはうまくいきません。月曜日変更する

他の言語でも失敗するでしょうから、私は言語の壁を取り除いた、受け入れられた答えを少し変えてみました。

 0 9 1-7 * *   [ "$(date '+\%u')" = "1" ] && echo "¡Es lunes!"

答え3

日数を処理する必要がない方が簡単だと思います。

毎月第 1 月曜日に実行:

0 2 * * 1 [ `date '+\%m'` == `date '+\%m' -d "1 week ago"` ] || /path/to/command

つまり、1 週間前の月が現在の月と同じでない場合は、その月の 1 日 1 (= 月曜日) になります。

同様に、第3金曜日には

0 2 * * 6 [ `date '+\%m'` == `date '+\%m' -d "3 weeks ago"` ] || /path/to/command

つまり、3週間前の月が現在の月と異なる場合、その月の3日目6日(=金曜日)になります。

答え4

毎月第 4 月曜日の午後 4 時に実行されるジョブを次のようにスケジュールしました。

0 16 22-28 * Mon [ "$(date '+\%a')" == "Mon" ] && touch /home/me/FourthMonOfMonth.txt

関連情報