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

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

毎日コマンドを実行するように「月」フィールドを使用してcronを設定する場合は、次のようになります。

1 22 */2 * * COMMAND

その月の日付が奇数(1、3、5、7、9など)のときはいつでも実行されます。

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

答え1

試している構文は実際にあいまいです。月の日数に応じて、月は奇数日に実行され、月は偶数日に実行されます。全体の可能性数を分けて計算するからです。日付範囲を手動で指定し、奇数または偶数日を使用してこの奇妙な動作を無視できます。偶数日スクリプトは長い月の31日には実行されないため、30日を偶数日の基準として使用し、それを31日のように分割するように指定すると、強制的に奇数日に実行できます。番号付けされた仕事。

構文は次のとおりです。

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

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

日数が異なる月に対するあなたの懸念はここでは重要ではありません。なぜなら、どの月もそれ以上の日数がなく、貧しい2月の場合、日付範囲が最後の1日か2日と決して一致しないからです。しかし、それは何の害もありません。

このアプローチの唯一の「問題」は、奇数日の周期の場合、31日間の次の数ヶ月間のコマンドもその月の1日に実行されることです。同様に、偶数期間を適用すると、各うるう年は2月末に3日の期間になります。 「一日一日」という規則的なパターンが常に偶数日や奇数日に発生するわけではないという事実を避けることはできません。 。

答え2

1つの可能性は、次のように年間の1日を使用することです。

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

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

UnixとLinuxシステムでテストされています。

答え3

「その他」なのか毎日確認してみよう :-) (bcプログラムが必要)

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

(コードが正しく表示されるかどうかわかりません。date +%sバックティックの間にある部分です。)

答え4

個人的には、私は((jultest=$juledate/2))10より大きい数字の問題のため、この方法を使用しません。

他のユーザーが提案したように、bcはより強力なソリューションを提供できます。

juldate=$(date +%j)
jultest=$(echo "obase=16;$juldate*2" | bc)
if [ $juldate -ne $jultest ]
then
  echo "This is an odd numbered week"
fi

関連情報