1週間、2週目、3週目、特定の曜日のcronを予約する方法は?

1週間、2週目、3週目、特定の曜日のcronを予約する方法は?

A.sh月に5週間、5つの水曜日がある場合は、最初の週水曜日、2番目の週水曜日、3番目の週水曜日、4番目の週水曜日にスクリプトを実行するようにクローンをスケジュールしようとします。 5週目の水曜日にはrunを実行する必要がありますb.sh

その他

A.sh月に4週間と4つの水曜日がある場合は、最初の週水曜日、2番目の週水曜日、3番目の週水曜日、および4番目の週水曜日にスクリプトが実行されるようにクローンを予約しようとします。b.sh

答え1

元の質問に対する元の答えです。

次のようなものが必要です。

0 1 1-21 * * [ $(date +\%u) -eq 3 ] && "call your command/script here"

このスケジュールは、0 1 1-21 * *「1日から21日まで毎日午前1時にジョブを実行します」を意味します。今、質問はなぜ1日から21日に制限するのですか?答えは、最良の場合、毎月1日がすでに水曜日に始まるからです。1)crontabは毎月1日、8日 15日に実行されます。

最悪の場合、1週目(7日目)の最終日となるため、7日 14日 7日にcrontabが実行されます。20日毎月3日なので、実行日数を月に1~21日に制限します。

しかし、man -s 5 crontab彼はこう言いました。

注:コマンドが実行される日付は、日付と曜日の2つのフィールドで指定できます。両方のフィールドが制限されている場合(例:*で始まらない)、次の場合にコマンドが実行されます。誰でもフィールドは現在の時刻と一致します。

これが私たちが日付を選択し、*を使用して曜日を表す理由です。

クローンタップ操作

上記のように、crontabで曜日を指定するのではなく、単純な操作を実行して処理します。testシェルを通してそして[ $(date +\%u) -eq 3 ];曜日が週の3日目であることを確認してください。つまり、水曜日(曜日は0〜6、0、...、6 Sun)であることを確認して、次のコマンドを実行します。スクリプト。


今修正された質問に答えてください。

0 1 * * 3 [ $(date +\%m) -eq $(date -d'+7days' +\%m) ] && scriptA.sh || scriptB.sh

最後の水曜日(、今日の水曜日+ 7日後(次の水曜日)[ $(date +\%m) -eq $(date -d'+7days' +\%m) ]が同じ月であることを確認し、最後の水曜日でない場合はscripA.shが実行され、そうでない場合は最後の水曜日の場合はscriptB.shが実行されます。$(date +\%m)$(date -d'+7days' +\%m)

上記のように、scriptA.shは最後の水曜日を除いて毎月水曜日に実行され、その後はscriptB.shが実行されます。

もちろん、crontabエントリを複雑にするのではなく、これらのテストをscript [AB] .shに移動することもできます。

注:上記の回避策は、その部分を削除して単一のコマンド/スクリプトを実行するために適用することができ、失敗した場合にエラーを通知してcronがそれに反応したくない|| scriptB.sh場合はその部分に置き換えることもできます。|| trueMAILTO

関連情報