1週間おきにcron経由でスクリプトを実行する


12

私はこれを行う方法についてかなり多くの研究を行ってきましたが、たとえば木曜日に毎週、cronで直接ジョブを実行する方法はありません。

今、私は毎週実行するだけのスクリプトを作成することに傾いています。実行時に「フラグ」ファイルにタッチします。実行してファイルが既に存在する場合は、ファイルを削除します隔週のアクション)。

私の質問は、隔週で自動的に実行されるアクションのbashスクリプトという目標を達成するための、よりエレガントでシンプルな方法はありますか?

ありがとう!


1
フラグファイルの代わりに、ISO週番号を使用できます。(たとえばstrftimeの%V。)

@ロジャー:あなたはスクリプト内の条件で意味すると思います。
追って通知があるまで一時停止します。

@Dennis:する必要はありません(たとえば、私の答えがスクリプトの外でどのようにチェックされるかを見てください)が、私の主なポイントは、はるかにシンプルでファイルシステムの状態を必要としないことです。しかし、私はそれが月の日付を確認するのと同様の欠点を持って実現:何年かは53週を持っているし、いくつかは52持っている

回答:


11
0 0 * * Thu bash -c '(($(date +\%s) / 86400 \% 14))' && your-script

私は怠け者なので、bashを使用して計算を行いました。好きなものに切り替えてください。1970年1月1日が木曜日であることを利用します。他の曜日については、オフセットを適用する必要があります。Cronはパーセント記号をエスケープする必要があります。

クイックチェック:

function check {
  when=$(date --date="$1 $(($RANDOM % 24)):$(($RANDOM % 60))" --utc)
  echo -n "$when: "
  (($(date +%s --date="$when") / 86400 % 14)) && echo run || echo skip
}

for start in "2010-12-02" "2011-12-01"; do
  for x in $(seq 0 12); do
    check "$start + $(($x * 7)) days"
  done
  echo
done

注:私はランダムな時間を選択して、これが木曜日のいつでも実行される場合に機能することを示しています。

出力:

Thu Dec  2 06:19:00 UTC 2010: run
Thu Dec  9 23:04:00 UTC 2010: skip
Thu Dec 16 05:37:00 UTC 2010: run
Thu Dec 23 12:49:00 UTC 2010: skip
Thu Dec 30 03:59:00 UTC 2010: run
Thu Jan  6 11:29:00 UTC 2011: skip
Thu Jan 13 13:23:00 UTC 2011: run
Thu Jan 20 20:33:00 UTC 2011: skip
Thu Jan 27 16:48:00 UTC 2011: run
Thu Feb  3 17:43:00 UTC 2011: skip
Thu Feb 10 05:49:00 UTC 2011: run
Thu Feb 17 08:46:00 UTC 2011: skip
Thu Feb 24 06:50:00 UTC 2011: run

Thu Dec  1 21:40:00 UTC 2011: run
Thu Dec  8 23:24:00 UTC 2011: skip
Thu Dec 15 22:27:00 UTC 2011: run
Thu Dec 22 02:47:00 UTC 2011: skip
Thu Dec 29 12:44:00 UTC 2011: run
Thu Jan  5 17:59:00 UTC 2012: skip
Thu Jan 12 18:31:00 UTC 2012: run
Thu Jan 19 04:51:00 UTC 2012: skip
Thu Jan 26 08:02:00 UTC 2012: run
Thu Feb  2 17:37:00 UTC 2012: skip
Thu Feb  9 14:08:00 UTC 2012: run
Thu Feb 16 18:50:00 UTC 2012: skip
Thu Feb 23 15:52:00 UTC 2012: run

2
エポックからの秒数は本質的にUTCですが、cronはローカル時間で実行されます。システムのタイムゾーンがUTCでない場合、混乱が生じます。(「なぜ実行されないのですか?ああ、UTCですでに金曜日」)。夏時間の存在により、これを回避することははるかに困難になります(日付calは現在のUTCオフセットを示すため、不可能ではありませんが)
-derobert

5

1つの方法は、atLinuxを実行している場合にユーティリティを使用することです。スクリプトの最後にこれを置くことができます。

at X + 2 weeks -f myscript

どこXは、あなたがでスクリプトを実行する時間です。at最初に実行したい時間だけ呼び出しを初期化するには、上記のステートメントがスケジュールされた呼び出しを更新し続けます。


これは長期的な解決策になるだろうされている場合は、私はそれを実行する必要があるかどうかを考え出すことになるスクリプトで関数を作成しにかかわらず、私はこれを実行することはお勧めwouldntの
ポール

3

anacronシステムで使用できる場合、物事はずっと簡単になります。使用するにはanacronするには、インストールする必要があります。また、rootアクセスも必要です。古いシステム(RHEL 5.xなど)では動作しません。ancronの古いバージョンは起動時にのみ実行されます。新しいシステム(RHEL 6.xなど)で動作します。

を使用するanacronと、週に1回Xジョブを実行するなど、より柔軟な方法でジョブをスケジュールできます。またanacron、コンピューターが使用可能になったときにジョブを実行します。つまり、システムがアップまたはダウンしたときを考慮する必要はありません。

1週間おきにスクリプトを実行するには、次のような行を/ etc / anacrontabに追加する必要があります。

14 5 myScript script.sh

詳細については、manページをご覧ください。


使用することanacronは明らかにIMOで最もクリーンなソリューションです(一部の人々にとって望ましくない結果をもたらさない限り)。
JanC

0

隔週を定義するよりエレガントな方法があるかどうかはわかりませんが、これはあなたのために働くかもしれません。

00 06 1-7,15-21 * * test `date +\%a` = Thu && /path/to/script

これにより、月の第1木曜日と第3木曜日の午前6時にスクリプトが起動されます。


2
しかし、月曜日に木曜日が3つある場合は、1週間スキップされます。
デビッドZ

1
木曜日が3つしかない月はありますか?木曜日が5つある場合、1週間スキップされることがわかりますが。に更新できます1-7,15-21,29-31が、最後のセットに一致するものがあればバックツーバックで実行されます
...-pferate

1
3木曜日までに、合計3木曜日ではなく、スクリプトが実行される3木曜日を意味しましたか?初めて見間違えたかもしれません。
pferate

0

毎週実行し、週番号が奇数であるかどうかを確認するためのスクリプトをチェックします:はいの場合は終了します。

これは、12月から1月まで機能するために、さらに考えが必要です。

おそらく、スクリプトに「最後の正常な実行」フラグファイルを設定させてください。スクリプトが起動したら、フラグファイルが14日前に最後に変更されたことを確認します。

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