3日ごとのCronジョブ


93

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


4
はい、可能です。これはSuperUserに属しています。

anacronを使用すると、月の境界に関係なく3日ごとに実行できます。
ryanpattison

回答:


125

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

0 0 */3 * *

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

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

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

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


9
@whatshakin:それは、「3日ごと」をどの程度正確にしたいかに依存します。これは、3で割り切れる任意の日に機能します。月の境界では正確ではありません。
David

3
@whatshakin:cronjob構文はWikipediaでも説明されています:en.wikipedia.org/wiki/Cronjob
Felix Kling

4
これはグーグルでの非常に高い結果であり、そのため、受け入れられた回答が正しかった場合は、これは正しくありません。タレコの説明は正しいと思います。
lynks 2012

14
どちらの提案も実際には3日ごとにジョブを実行するため、答えは正しくありません。 0 0 */3 * *は、1日、4日、7日などに実行されることを意味します(*/3はを1-31/3意味します1,4,7...31)。そのため、月末にギャップが小さくなります。(前月は31日だった場合は、行で2日間実行されます。)date('j') % 3パターンは毎年再起動することで同様の問題があり、年が3で割り切れる日数を持っていない
CJM

8
残念ながらこれが答えとして受け入れられたのも残念です。私は本当に、月の境界に関係なく、N日ごとに探していました(植物のようなものは、月の何日に水を手に入れてもかまいません)。少なくとも、私はすべてのコメントを読んだ後で、cronタイマー自体がその欲望を完全にモデル化しているわけではないと判断したと思います。
Travis Griggs、2015


24

私はcronの専門家ではありませんが、次の点についてはどうですか。

0 */72 * * *

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

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


3
これは、受け入れられているソリューションよりも正確です。ヶ月を変更するときに受け入れられた答えは失敗します:then at 2019-02-28 00:00:00 then at 2019-03-01 00:00:00
山本

これがいつ発生するかをどのように計算しますか?
Bruce Edge

2
crontab.guruによると、これは毎日実行されます。誰が正しいのですか?
velop

1
crontab.guruman crontabによると、時間の列の値は0から23の間でなければなりません。
harperville

1
* / 72は実質的に0と同じです。これは毎晩深夜に実行されます。
バッティ

19

cronは「ステートレス」であるため、「頻度」を正確に表現することはできず、現在の時間と(見かけ上)継続的に一致する「パターン」のみを表現できます。

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

通常、その定期的なイベントを終了し、完全に新しいイベントを再開する必要があります。これは、複雑なカレンダーアプリでさえ繰り返しパターンを表す方法の限られた表現力を示しています。そしてもちろん、カレンダーには多くの状態があります-個々のイベントは個別に削除または再スケジュールできます(ほとんどのカレンダーアプリで)。

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

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

(*タイムスタンプ付きのインジケーターは、永続化された状態であり、操作および検査できますが、cronではできません)

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


7
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


4

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

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

残念ながら、* / 3は、上の間隔を設定している毎月のn日ない すべてのn日。参照してください:ここでの説明を。月末には、定期的な問題が保証されています。

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
...

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

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

この例では、ジョブは毎日午前12時にチェックされますが、1970年1月1日からの剰余3からの日数が0の場合にのみ実行されます。

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

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

3

どうですか:

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日に実行を使用しますが、1か月が31日になると間違って実行されます。everyこのスクリプトは、年度終了後だけ間違っています。


3

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

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

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)

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

ここで、私はそれに関する詳細な投稿を書きました:Unixでのセットアップcron


1

たとえば、月曜日と木曜日に実行するように構成すると、より簡単になり、3日と4日の休憩が得られます。

それ以外の場合は、毎日実行するように構成しますが、php cronスクリプトを次のように早く終了させます。

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

0

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

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


0

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

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


それがあるため、来年に非うるう年からロールオーバーこのしゃっくりはありません( 365-1 ) % 3 == 1が、は ( 1 - 1 ) % 3 == 0?Unixエポック以降の日数に基づいて、より良い計算が行われると思います。
kmoser
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.