web-dev-qa-db-ja.com

3日ごとのcronジョブ

cronjob を3日ごとに実行することは可能ですか?または、月に10回程度です。

74
tmartin314

3日ごとに実行します...

0 0 */3 * *

どのようにそのことについて?

1日、4日、7日など、月の特定の日に実行したい場合は、現在の月をチェックする条件文をスクリプトに含めることができます。

if (((date('j') - 1) % 3))
   exit();

または、@ marioが指摘しているように、日付に基づいて日付を取得する代わりに、date( 'k')を使用して日付を取得できます。

100
sberry
* * */3 * *  that says, every minute of every hour on every three days. 

0 0 */3 * *  says at 00:00 (midnight) every three days.
62
tareco

Cronは「ステートレス」であるため、「周波数」を正確に表現することはできず、現在の時間に対して(明らかに)連続的に一致する「パターン」のみを表します。

質問を言い換えると、「2泊以内に実行された夜間をスキップすることを除いて、毎晩00:01にcronjobを実行できますか?」 cronが現在の時刻とジョブ要求の時刻パターンを比較しているとき、cronが過去にジョブを実行したかどうかを知る方法はありません。

(確かに、過去のジョブを記録するステートフルcronを記述して、この状態に一致するパターンを含めることは可能ですが、ほとんどのオペレーティングシステムに含まれる標準のcronではありません。そのようなシステムは、このようなパターンが「リセット」される場合、たとえば、時刻が変更されると(つまり、crontabエントリが変更されると)、パターンはリセットされますか?お気に入りのカレンダーアプリを見て、スケジュールされたイベントの繰り返しパターンを表現するのがどれほど複雑になるかを確認し、カレンダーの開始イベントには自然な「開始」a/k/a「リセット」日付があるため、リセットの問題はありません。1週間おきの定期的なカレンダーイベントのスケジュールを変更して、クリスマスに1週間延期しますたとえば、通常、その繰り返しイベントを終了して完全に新しいものを再起動する必要があります;これは、複雑なカレンダーアプリでさえ繰り返しパターンを表す方法の限られた表現力を示しています。状態-個々のイベントは個別に削除または再スケジュールできます(ほとんどのカレンダーアプリ))。

さらに、あなたはおそらく3日ごとに仕事をしたいです成功した場合、しかし最後の1つが失敗した場合、すぐに、おそらく次の夜(3日以上待たない)またはもっと早く、 1時間後(ただし、朝の到着時に再試行を停止します)。明らかに、cronはジョブが成功したかどうかを知ることができず、パターンはより頻繁な「再試行」スケジュールを表現することもできません。

とにかく-あなたは自分が望むことをすることができます。スクリプトを作成し、cronに毎晩00:01に実行するように指示します。このスクリプトは、「最後の実行」を記録する何か*のタイムスタンプをチェックし、それが3日以上前であれば**、ジョブを実行して「最後の実行」タイムスタンプをリセットします。

(*そのタイムスタンプ付きのインジケータは、操作と検査はできますが、cronはできません。

**人間が読める時計時間を使用している場合、時間計算に注意してください-年に2回、一部の日は23時間または25時間であり、02:00-02:59は1日で2回発生するかどうかすべて。これを回避するにはUTCを使用してください。

13
Jaime Guerrero

私はcronの専門家ではありませんが、どうですか:

0 */72 * * *

72時間ごとに中断なしで実行されます。

https://crontab.guru/#0_/ 72___

11
Fabio Nolasco
0 0 1-30/3 * *

これは1日から3日ごとに実行されます。スケジュールされた20回の実行を次に示します

  • 2015-06-01 00:00:00
  • 2015-06-04 00:00:00
  • 2015-06-07 00:00:00
  • 2015-06-10 00:00:00
  • 2015-06-13 00:00:00
  • 2015-06-16 00:00:00
  • 2015-06-19 00:00:00
  • 2015-06-22 00:00:00
  • 2015-06-25 00:00:00
  • 2015-06-28 00:00:00
  • 2015-07-01 00:00:00
  • 2015-07-04 00:00:00
  • 2015-07-07 00:00:00
  • 2015-07-10 00:00:00
  • 2015-07-13 00:00:00
  • 2015-07-16 00:00:00
  • 2015-07-19 00:00:00
  • 2015-07-22 00:00:00
  • 2015-07-25 00:00:00
  • 2015-07-28 00:00:00
7
Vishal

どうですか:

00 00  *  *   * every 3 days && echo test

everyはスクリプトです:

#!/bin/sh

case $2 in
    days)
        expr `date +%j` % $1 = 0 > /dev/null
        ;;

    weeks)
        expr `date +%V` % $1 = 0 > /dev/null
        ;;

    months)
        expr `date +%m` % $1 = 0 > /dev/null
        ;;
esac

したがって、毎日実行されます。

*/3の使用は、月の3日、6日、... 27日、30日に実行されますが、月の31日目以降は間違っています。 everyスクリプトは、年末以降にのみ間違っています。

3
MattBlissett

私はあなたが必要なものを持っているとは思わない:

0 0 */3 * * ## <<< WARNING!!! CAUSES UNEVEN INTERVALS AT END OF MONTH!!

残念ながら、*/3は毎n日notn日ごと。参照: ここの説明 。月末には、定期的な問題が保証されます。

1st  at 2019-02-01 00:00:00
then at 2019-02-04 00:00:00 << 3 days, etc. OK
then at 2019-02-07 00:00:00
...
then at 2019-02-25 00:00:00
then at 2019-01-28 00:00:00
then at 2019-03-01 00:00:00 << 1 day WRONG
then at 2019-03-04 00:00:00
...

この記事 によると、実行中のコマンドにモジュロ演算を追加してTRUEの「N日ごと」を取得する必要があります。例えば:

0 0 * * *  bash -c '(( $(date +\%s) / 86400 \% 3 == 0 )) && runmyjob.sh

この例では、ジョブは毎日午前12:00にチェックされますが、3を法とする01-01-1970以降の日数が0の場合にのみ実行されます。

特定の日付から3日ごとにしたい場合は、次の形式を使用します。

0 0 * * *  bash -c '(( $(date +\%s -d "2019-01-01") / 86400 \% 3 == 0 )) && runmyjob.sh
2
Brad Cozine

crontabの基本を学ぶ必要があります。

コマンドcrontab -eでcronを編集してから、 ⌃ (CTRL) + X それから Y そして最後に押す ENTER (return) Macではファイルを保存します。 crontab -lではなく、新しいcronがインストールされていることを確認できます

Crontabファイルには、分、時間、日、月、曜日を指定する5つのフィールドがあり、その後にその間隔で実行されるコマンドが続きます。

*     *     *   *    *   command to be executed
-     -     -   -    -
|     |     |   |    |
|     |     |   |    +----- day of week (0-6) (Sunday=0)
|     |     |   +------- month (1-12)
|     |     +--------- day of month (1-31)
|     +----------- hour (0-23)
+------------- min (0-59)

上記の値フィールドの*は、その列の括弧内のすべての有効な値を意味します。

ここで、私はそれについて詳細な投稿を書きました: nixでCronを設定

2
Ahmad Awais

単に実行するように設定した方が簡単です。月曜日と木曜日には、3日間と4日間の休憩が与えられます。

それ以外の場合は、毎日実行するように設定しますが、php cronスクリプトを次の方法で早期に終了します。

if (! (date("z") % 3)) {
     exit;
}
1
mario

0 0 * * * [ $(($((date +%-j- 1)) % 3)) == 0 ] && script

dateから年の日を取得し、1でオフセットして0から開始し、3を法とするかどうかを確認します。

0
Tanner

1日、4日、7日など、月の特定の日に実行したい場合は、現在の月をチェックする条件文をスクリプトに含めることができます。

これに必要なのは、3日ごとを意味する*/3ではなく、月の1日から3日ごとを意味する1/3を使用することであると考えました。 7/3は、月の7日から始まる3日ごとなどを意味します。

0
Colin Hilbert