毎月第1月曜日の8.30にcronからジョブを実行したいと思います。 cronウィキペディアのページによると
通常、ジョブは時刻/日付の指定フィールドがすべて現在の日付と一致するときに実行されますが、「月」と「曜日」の両方が制限されている場合(「*」ではない)、次の例外があります。 どちらか「月の日付」フィールド(3)または「曜日」フィールド(5)は、現在の日付と一致する必要があります。
(私の強調)
つまり、月の最初の月曜日は実行できません。月の最初の(または何でも)日しか実行できません。私はそれを一周する方法を考えることができません。
条件を実際のcrontabコマンドに入れることができます。
[ "$(date '+%a')" = "Mon" ] && echo "It's Monday"
これで、この条件が月の最初の7日間のいずれかに当てはまる場合、最初の月曜日になります。ただし、crontabでは、パーセント構文をエスケープする必要があります。
0 12 1-7 * * [ "$(date '+\%a')" = "Mon" ] && echo "It's Monday"
echo
コマンドを、実行する実際のコマンドに置き換えます。 同様のアプローチ も見つけました。
私はスペイン語のロケールを備えたコンピュータを持っているので、monがlunに変わるため、このアプローチは私にとってはうまくいきません。
他の言語も同様に失敗するので、言語の壁を取り除いた、受け入れられた回答に少し変更を加えました。
0 9 1-7 * * [ "$(date '+\%u')" = "1" ] && echo "¡Es lunes!"
日数を処理する必要がない場合は、より簡単です。
月の最初の月曜日を実行します。
0 2 * * 1 [ `date '+\%m'` == `date '+\%m' -d "1 week ago"` ] || /path/to/command
つまり、1週間前の月が現在の月と異なる場合、その月の最初の日1(=月曜日)になります。
同様に、第3金曜日
0 2 * * 6 [ `date '+\%m'` == `date '+\%m' -d "3 weeks ago"` ] || /path/to/command
つまり、3週間前の月が現在の月と異なる場合、その月の3日目6(=金曜日)になります。
次のように、毎月第4月曜日の4:00にジョブを実行するようにスケジュールしましたPM:
0 16 22-28 * Mon [ "$(date '+\%a')" == "Mon" ] && touch /home/me/FourthMonOfMonth.txt
私の知る限り、crontabだけを使用することは不可能ですが、ラッパー関数を使用して、「月の最初の7日間」のcontabエントリーから正しい日を選択することができます。エントリから this を参照してください。
ラッパースクリプトは
#! /usr/bin/ksh
day=$(date +%d)
if ((day <= 7)) ; then
exec somecommand
fi
exit 1
crontabエントリを使用して実行する必要があります(wrapper.shと呼ばれ、グローバルに利用できると仮定)
0 0 * * 1 wrapper.sh
Solaris 10では、条件を次のようにフォーマットする必要がありました。
[ `date +\%a` = "Sat" ] && echo "It's Saturday"
Cronjobを月の最初の7日間実行してみて、月曜日にのみ実行することができます。
30 8 * * 1 [`date +\%d` -le 07] && <job>
上記はあなたのために働くべきです。
使用をお勧めします
"$(/bin/date '+%\w')" = "1"
の代わりに
"$(date '+\%a')" = "Mon"
ロケールの問題を回避するため。
私はこの種の問題の一般的な解決策を作りました、それは月の最後の平日で最初、2番目、3番目.....のために働きます。
次のように使用できます。
30 06 * * Mon run-if-today 1 "Mon" && echo "First Monday"
30 06 * * Thu run-if-today 3 "Thu" && echo "Third Thursday"
30 06 * * Sun run-if-today L "Sun" && echo "Last Sunday"
スクリプトrun-if-todayは、曜日と目的の曜日の両方の日付範囲をチェックします。両方が一致する場合は0を返し、そうでない場合は1を返します。
ここでコードを確認してください。 https://github.com/xr09/cron-last-sunday
0 9 1-7 * 1 *
これは毎月月曜日に機能します。
この使用法は最も一般的であり、ロケールの問題を回避します。
[ `/bin/date +\%u` -eq 1 ]
毎月第1月曜日の午前6時は、/etc/crontab
では次のようになります。
00 6 1-7 * * root [ `/bin/date +\%u` -eq 1 ] && /run/yourjob.sh
Phpとjsを使用してcronステートメントを解釈しているため、bashを使用できません。最後に、それはisがcronだけで実際に可能であることがわかりました:
0 30 8 * 1/1 MON#1
これが他の誰かを助けることを願っています。とにかく、私はあなた方すべてが美しい日であることを望みます。 :-)
私はこれが問題をよりエレガントに解決すると信じています:
30 8 1-7 * 1 /run/your/job.sh