月の第 2 および第 4 土曜日にジョブを実行するための cron (linux) 構文は何ですか?
5 に答える
その月の第 2 土曜日は、8日から14 日までの日付の 1 つ (1 つだけ) に当たります。同様に、第 4 土曜日は、22 日から 28 日までのいずれかの日になります。
曜日フィールドを使用して土曜日に制限できると思うかもしれません (6
下の行の )。
0 1 8-14,22-28 * 6 /path/to/myscript
残念ながら、マンページによると、月の日と曜日はOR命題であり、どちらかがジョブを実行させます。
コマンドは
cron
、分、時、および月のフィールドが現在の時刻と一致し、2 つの日フィールド (月の日または曜日) の少なくとも 1 つが現在の時刻と一致する場合に実行されます。コマンドの実行日は、日と曜日の 2 つのフィールドで指定できます。両方のフィールドが制限されている (つまり、* ではない) 場合、いずれかのフィールドが現在の時刻と一致したときにコマンドが実行されます。たとえば
30 4 1,15 * 5
、コマンドは、毎月 1 日と 15 日の午前 4 時 30 分、および毎週金曜日に実行されます。
cron
したがって、これらの曜日ごとにジョブを実行するように設定し、土曜日でない場合はすぐに終了する必要があります。
したがって、cron
エントリは次のとおりです。
0 1 8-14,22-28 * * /path/to/myscript
(各可能な日の午前 1 時に実行する)。
次に、 の上部に/path/to/myscript
次のように入力します。
# Exit unless Saturday
if [[ $(date +%u) -ne 6 ]] ; then
exit
fi
また、スクリプトを変更できない場合 (たとえば、プログラムの場合)、そのチェックとそのプログラムへの呼び出しのみを含むスクリプトを作成し、cron
代わりにそれを実行します。
土曜日のテストをcrontab
ファイル自体に入れて、スケジューリング データをすべて 1 か所に保持することもできます。
0 1 8-14,22-28 * * [ `date +\%u` = 6 ] && /path/to/myscript
利用できる場合は、ncalを使用して、最初の列の横に曜日名が付いたカレンダーを取得し、曜日を grep して、その日が当たる月の日付を取得できます。 :
2012 年 8 月 す 5 12 19 26 モ 6 13 20 27 火 7 14 21 28 私たち 1 8 15 22 29 木 2 9 16 23 30 金 3 10 17 24 31 土 4 11 18 25
土曜日を表す "Sa"をgrep すると、その月の日付が土曜日である行が表示されます。awkを使用して特定の列 (「第 2」土曜日の場合は awk '{print($3)}'、第 4 土曜日の場合は awk '{print($5)}') を解析し、それを今日の日付 (date + %e) を実行すると、スクリプトを実行する必要があるかどうかがわかります。
次に、これを中心にスクリプトを作成し、それを土曜日に実行される crontab エントリに連結できます。したがって、土曜日に実行する場合、日付が第 2 または第 4 土曜日の場合は、正常に終了し、このスクリプトの後に crontab エントリで && を使用して実際のジョブを実行します。しかし、それが第 1 または第 3 土曜日の場合は、1 を終了すると && はジョブを実行しません。(完了しなかったなどのcronエラーメールが届きます)
上記のソリューションはうまく機能します。さらに、複数のスクリプト セットがあり、各セットが相互に依存しているという、より複雑な課題がありました。スクリプトの最初のセットは、毎月第 3 日曜日に実行する必要がありました。その月の第 3 日曜日の次の月曜日に 2 番目のスクリプト セットなど。上記のソリューションに基づいて、私が思いついたソリューションは次のとおりです。
第 3 日曜日の日付 15-21。
月曜日の第 3 日曜日の日付 16-22。
第3日曜日の後の火曜日17-23。
他の日付範囲は、スクリプトの最初のセット (トリガー スクリプト) との日数差によって相殺されます。