Cronjobは、土曜日に2週間ごとに土曜日に実行されます


11

今日は2014年10月3日金曜日3:58 AM

このようなcronjobを次の日付に実行するようにスケジュールしたいと思います。

  1. 2014年10月4日土曜日午前8時
  2. 2014年10月18日土曜日午前8:00
  3. 2014年11月1日土曜日午前8時... ...

つまり、2週間ごと、土曜日の8時です。

回答:


27
0 8 * * 6 test $((10#$(date +\%W)\%2)) -eq 1 && yourCommand

date +%W:年の週番号。月曜日を週の最初の日とし、今日は週39

10#$(date +%W)date +Wを10進数に変換し、シェルベースの解析の混乱を避ける

$((39%2)):モジュロ演算:結果は0(偶数の週番号)または1(奇数の週番号)、今週の結果は1、来週は0

test 1 -eq 1:算術テスト(等しい)、この場合、結果はブール値true

&& yourCommand:ブールAND:yourCommand前のコマンドの結果がブールtrueの場合にのみ実行

年は2つの奇数週になる可能性があることに注意してください:53(今年)と1(翌年)


2
それはエレガントです!それでも、お気づきのように、今年の第53土曜日には、4世紀ごとに約70年間発生するコーナーケースがあります。
MadHatter、2014年

@Cyrusはあなたの答えをありがとう、しかし私が書く場合* * * * 5 test $(($(date +%W)%2))-eq 1 && /u02/restore/scripts/test.shスクリプトはしません実行しますが、私が書いた場合* * * * 5 /u02/restore/scripts/test.shスクリプトが実行されます。なぜあなたの表現はうまくいかないのですか?ケースをテストしてみたところ、なんとか動作しないことがわかりました。
kupa

1
私の間違い。Cronは%を改行として解釈します。あなたのcronジョブでは、\の両方%をエスケープ:0 8 * * 6 test $(($(date +\%W)\%2)) -eq 1 && yourCommand
サイラス

この古い質問を返して申し訳ありませんが、私にとってはうまくいきませんでした。実行しようとすると$((10#$(date +%W)%2)) -eq 1 && echo OK、シェルは週の計算結果を実行しようとします-bash: 1: command not found。それがなぜそれをしているのか手がかりはありますか?ありがとう。
jhuet 2017年

3
@jhuet:testユーザーではなく、コマンドです。試してみる:test $((10#$(date +\%W)%2)) -eq 1 && echo odd || echo even
Cyrus

4

あなたが示したことは「毎週」です。次に、コードは次のとおりです。

0 8 * * 6

2週間ごとに実行する必要がありますか?

0 8 * * 6 expr `date +\%s` / 604800 \% 2 >/dev/null || yourCommand

1
コマンドについて説明してください
kupa

1
Cyrusが提供したものを使用することをお勧めします-$(($(date +%W)%2)) "W"は年間の週番号を表します。0から53まで。2で割り切れる場合は、「毎秒」の週です。cronジョブは毎週実行されますが「式」実行コマンドは、週の数を2で割っできる場合にのみyourCommandだから
Glueon

テストを実行すると$(($(date +%W)%2))-eq 1コマンドラインで何も返されません、なぜですか?
kupa、2014年

1
echo $?そのコマンドを実行した直後に実行して、その戻りコードを確認してください。それが重要なことです
Ale
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.