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
場合はその部分に置き換えることもできます。|| true
MAILTO