回答:
試した構文は実際にはあいまいです。月の日数に応じて、奇数月に実行される月と偶数日に実行される月があります。これは、計算方法が可能性の総数を取得し、それらを分割するためです。手動で日の範囲を指定し、奇数または偶数の日数を使用することにより、このストレッシュな動作をオーバーライドできます。偶数日のスクリプトは長い月の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月末を引き起こします。「隔日」の通常のパターンが毎月の偶数日または奇数日に常に当てはまるわけではないという事実を実際に回避することはできません。一致しない日数のある月。
0,2,4...,30,32,34
範囲外の値は一致しません。
0 0 2-30/2 * * command
ように、期待どおりに動作します。
私は、次のような年の日を使用する可能性があると思います:
# 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
test $(($(date +%s) / 86400 % 2)) == 0 && command
「その他」かどうか毎日チェックしましょう:- bc
) (プログラムが必要です)
0 0 * * * test $(echo `date +%s` / 86400 % 2 == 0 |bc) -eq 0 && command
(コードが正しく表示されるかどうかわかりません。date +%s
部分は逆アポストロフィの間にあります。)