![毎月第 1 月曜日に cron ジョブを実行しますか?](https://rvso.com/image/1316111/%E6%AF%8E%E6%9C%88%E7%AC%AC%201%20%E6%9C%88%E6%9B%9C%E6%97%A5%E3%81%AB%20cron%20%E3%82%B8%E3%83%A7%E3%83%96%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%BE%E3%81%99%E3%81%8B%3F.png)
毎月第一月曜日の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