web-dev-qa-db-ja.com

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

毎月第1月曜日の8.30にcronからジョブを実行したいと思います。 cronウィキペディアのページによると

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

(私の強調)

つまり、月の最初の月曜日は実行できません。月の最初の(または何でも)日しか実行できません。私はそれを一周する方法を考えることができません。

33
Max Williams

条件を実際のcrontabコマンドに入れることができます。

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

これで、この条件が月の最初の7日間のいずれかに当てはまる場合、最初の月曜日になります。ただし、crontabでは、パーセント構文をエスケープする必要があります。

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

echoコマンドを、実行する実際のコマンドに置き換えます。 同様のアプローチ も見つけました。

42
slhck

私はスペイン語のロケールを備えたコンピュータを持っているので、monlunに変わるため、このアプローチは私にとってはうまくいきません。

他の言語も同様に失敗するので、言語の壁を取り除いた、受け入れられた回答に少し変更を加えました。

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

日数を処理する必要がない場合は、より簡単です。

月の最初の月曜日を実行します。

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(=金曜日)になります。

8
joel

次のように、毎月第4月曜日の4:00にジョブを実行するようにスケジュールしましたPM:

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

私の知る限り、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
1
elemakil

Solaris 10では、条件を次のようにフォーマットする必要がありました。

[ `date +\%a` = "Sat" ] && echo "It's Saturday"
1
Will

Cronjobを月の最初の7日間実行してみて、月曜日にのみ実行することができます。

30 8 * * 1 [`date +\%d` -le 07] && <job>

上記はあなたのために働くべきです。

1
simer

使用をお勧めします

"$(/bin/date '+%\w')" = "1"

の代わりに

"$(date '+\%a')" = "Mon"

ロケールの問題を回避するため。

1
Manus Freedom

私はこの種の問題の一般的な解決策を作りました、それは月の最後の平日で最初、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
MGP
0 9 1-7 * 1 * 

これは毎月月曜日に機能します。

0
SIBHI S

この使用法は最も一般的であり、ロケールの問題を回避します。

[ `/bin/date +\%u` -eq 1 ]

毎月第1月曜日の午前6時は、/etc/crontabでは次のようになります。

00 6 1-7 * *    root    [ `/bin/date +\%u` -eq 1 ] && /run/yourjob.sh
0
Chris Hubbard

Phpとjsを使用してcronステートメントを解釈しているため、bashを使用できません。最後に、それはisがcronだけで実際に可能であることがわかりました:

0 30 8 * 1/1 MON#1

これが他の誰かを助けることを願っています。とにかく、私はあなた方すべてが美しい日であることを望みます。 :-)

0
kramer65

私はこれが問題をよりエレガントに解決すると信じています:

30 8 1-7 * 1 /run/your/job.sh
0
symcbean