web-dev-qa-db-ja.com

隔週でcron経由でスクリプトを実行する

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

現在、私はevery週だけを実行し、実行時に「フラグ」ファイルに触れ、実行してファイルがすでにそこにある場合は削除するスクリプトを作成することに傾倒していますファイル(隔週のアクションを実行しない)。

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

ありがとう!

12
dmkmills
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

これを木曜日のいつでも実行できることを示すためにランダムな時間を選択したことに注意してください。また、年の境界を超え、木曜日が4と5の両方の月を含む日付を選択しました。

出力:

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
11
Roger Pate

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

at X + 2 weeks -f myscript

ここで、[〜#〜] x [〜#〜]は、スクリプトを実行する時刻です。初期化するには、最初に実行するときにatを呼び出すだけです。その後、上記のステートメントは、スケジュールされた呼び出しを更新し続けます。

5
gvkv

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

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

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

14 5 myScript script.sh

詳細については、manページを参照してください。

3
memin

私はそれを毎週実行し、スクリプトで週番号が奇数かどうかを確認します。

これは12月から1月まで機能するように、もう少し考える必要があります。

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

0
glenn jackman

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

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

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

0
pferate