cronに1日おきにコマンドを実行するように指示する方法(奇数/偶数)


45

次のように、「Day of Month」フィールドを使用して1日おきにコマンドを実行するようにcronを構成する場合:

1 22 */2 * * COMMAND

月の日が奇数であるたびに実行されます:1,3,5,7,9など。

cronを2,6,8,10などのように毎月実行するように構成するにはどうすればよいですか(文字通り指定せずに、毎月の日数が異なるため問題になります)?

回答:


60

試した構文は実際にはあいまいです。月の日数に応じて、奇数月に実行される月と偶数日に実行される月があります。これは、計算方法が可能性の総数を取得し、それらを分割するためです。手動で日の範囲を指定し、奇数または偶数の日数を使用することにより、このストレッシュな動作をオーバーライドできます。偶数日のスクリプトは長い月の31日に実行されることはないため、30日間を偶数日のベースとして使用して何かを失うことはありません。日実行。

構文は次のようになります。

# Will only run on odd days:
0 0 1-31/2 * * command

# Will only run on even days:
0 0 2-30/2 * * command

月が同じ日数ではないというあなたの懸念はここでは重要ではありません。これは、これよりも多くの日がある月がないためです。リストされています。

このアプローチの唯一の「落とし穴」は、奇数の日周期の場合、31日間の月に続くコマンドは月の最初にも実行されることです。同様に、偶数サイクルを強制している場合、各うるう年は3日間のサイクルと2月末を引き起こします。「隔日」の通常のパターンが毎月の偶数日または奇数日に常に当てはまるわけではないという事実を実際に回避することはできません。一致しない日数のある月。


1
ありがとう、でも28日しかない2月のような月はどうなりますか?星は実際にそれを処理します-しかし、実際にはあいまいです。
フレディ

3
@freddie:編集済みの回答を参照してください。ただし、範囲外の値は無視されるだけで、2月30日または31日には何も起こらないため、問題ではありません。今まで。次のようなリストを手動で指定できますが、0,2,4...,30,32,34範囲外の値は一致しません。
カレブ

1
ありがとう!わかりました、有益な答えをありがとう!
フレディ

3
Ubuntuサーバー8.04では、曜日のゼロを使用する構文は無効であるようです(悪い曜日)。ただし、次の構文は受け入れられます0 0 2-30/2 * * command

1
FedoraとRHEL 5,6,7も、月の日として0が好きではありません。user31053が指摘した 0 0 2-30/2 * * commandように、期待どおりに動作します。
NoelProf 14年

2

私は、次のような年の日を使用する可能性があると思います:

# for odd days
test $(((`date +%j` % 2))) != 0 && command

# for even days
test $(((`date +%j` % 2))) == 0 && command

UnixおよびLinuxシステムでテストされています。


私はこの答えを好むのは、数ヶ月で日数が奇数の問題をスキップするからです。とにかく、test $(($(date +%j) % 2)) == 0 && command

%jはユリウス日ではないことを確認したため、新年の移行を回避する最適なコードは秒で計算する必要がありますtest $(($(date +%s) / 86400 % 2)) == 0 && command
。– caligari

コメントをありがとう!私たちの提案は私たちにとって魅力的なものでした。このスキームを使用して、異なるサーバーノードで毎日cronを実行し、それらはすべて同じcrontabを共有しますが、スクリプトはそのうちの1つでのみスクリプトを実行できます。ただし、より具体的にする必要がある場合は、提案を検討します。ありがとう!!!
ジョルディ

1

「その他」かどうか毎日チェックしましょう:- bc) (プログラムが必要です)

0 0 * * * test $(echo `date +%s` / 86400 % 2 == 0 |bc) -eq 0 && command

(コードが正しく表示されるかどうかわかりません。date +%s部分は逆アポストロフィの間にあります。)


これは1日おきに実行されますが、質問には答えません。月に応じて、奇数日でも時々偶数日でも実行されます。これは、質問のコードと同じ結果になります。エポックからの秒数で独自の計算を行うことで、結果にたどり着きます。これはエポック以降の偶数日に実行されますが、カレンダーの偶数日に実行されません。
カレブ14

1

通常、毎日実行し、スクリプトでロジックを使用して、今日実行する必要があるかどうかを判断します。

前回の実行時を示す簡単なステータスファイルを作成し、比較することは非常に簡単に機能します。

異なるソースを介して実行する必要がある場合は、引数に依存するようにします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.