web-dev-qa-db-ja.com

毎月第2および第4土曜日に実行

月の第2土曜日と第4土曜日にジョブを実行するためのcron(linux)構文は何ですか?

11
Neil

月の第2土曜日は、8月の日付の1つ(および1つだけ)に該当します。番目 14へ番目 包括的。同様に、第4土曜日はone 22の間の日付になりますnd と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
22
paxdiablo

@paxdiabloの返信を拡張して、スクリプトの代わりにcrontabに追加を入れてみませんか?

#m h dom       mon dow command
0  1 8-14,22-28 *   *   [ `date +\%u` = 6 ] && /path/to/myscript

%uの前のバックスラッシュに注意してください。これは、コマンドラインでこれを試す場合は必要ありませんが、シェルがコマンド全体を表示できるようにするためにcrontabエントリで必要です。

この方法で行うと、同僚が最初に見た場所に適切な日を選択するためのすべてのロジックが配置され、必要に応じて別の日にスクリプトを手動で実行できます。

10
BertD

2つの仕事を持つことについて

0 0 0 ? * 7#2
0 0 0 ? * 7#4

最初のものは与える

2015-12-12 00:00:00 (-08:00)
2016-01-09 00:00:00 (-08:00)
2016-02-13 00:00:00 (-08:00)
2016-03-12 00:00:00 (-08:00)
2016-04-09 00:00:00 (-07:00)

そして二番目は与える

2015-11-28 00:00:00 (-08:00)
2015-12-26 00:00:00 (-08:00)
2016-01-23 00:00:00 (-08:00)
2016-02-27 00:00:00 (-08:00)
2016-03-26 00:00:00 (-07:00)
2
Sicong

上記のソリューションはうまく機能します。さらに、複数のスクリプトセットがあり、各セットが他のセットに依存しているという、より複雑な課題がありました。スクリプトの最初のセットは、月の第3日曜日に実行する必要がありました。月の第3日曜日に続く月曜日の第2スクリプトセット、以下同様。上記のソリューションに基づいて私が思いついたソリューションは次のとおりです。

第3日曜日の日付15-21。

第3日曜日の次の月曜日16-22。

第3日曜日の後に火曜日17-23。

他の日付範囲は、トリガースクリプトであるスクリプトの最初のセットからの日数の差によってオフセットされます。

1
Louie Labayen

使用できる場合は、ncalを使用して、最初の列の横に曜日名が記載されたカレンダーを取得し、曜日をgrepして日付を取得できます。その日が該当する月:

 2012年8月
 Su 5 12 19 26 
 Mo 6 13 20 27 
 Tu 7 14 21 28 
 We 1 8 15 22 29 
 Th 2 9 16 23 30 
 Fr 3 10 17 24 31 
 Sa 4 11 18 25 

土曜日の "Sa"に対してgrepを指定すると、土曜日である月の日付を含む行が表示されます。 awkを使用して特定の列(「第2」土曜日のawk '{print($ 3)}'と第4土曜日のawk '{print($ 5)}')を解析して比較する場合それを今日の日付(日付+%e)にすると、スクリプトを実行する必要があるかどうかがわかります。

次に、これを中心にスクリプトを作成し、土曜日に実行されるcrontabエントリにまとめてチェーンできます。したがって、土曜日に実行する場合、日付が第2土曜日または第4土曜日に等しい場合は、完全に終了し、このスクリプトの後にcrontabエントリで&&を使用して実際のジョブを実行します。しかし、それが第1または第3土曜日の場合、1を終了してから&&はジョブを実行しません。 (完了しなかったなどのcronエラーメールが届きます)

0
chouse