間隔cronはいつ最初に実行されますか? (例:* / 3日)

間隔cronはいつ最初に実行されますか? (例:* / 3日)

長すぎます。:cronは実行時間を決定するために間隔値を使用して現在の日付の値と比較しますか、それとも文字通り「3日ごとに」作成後に指定された時間に実行されますか?

質問:

次のタスクを追加すると、明日の真夜中にcrontab -e初めて実行されますか、それとも明日から3日間実行されますか?それとも、毎月「3番目」の日にのみ適用されますか? 1日目、4日目、7日目、10日目…?

0 0 */3 * * /home/user/script.sh

昨日このクローンを入れて今朝実行しましたが(これが私の質問に対する答えかもしれません)、これが正しいことを確認したいと思います。今日は31日ですが、間隔値がシーケンスに属しているようです。 cronが今月1日にインターバル実行を開始すると、明日再び実行されますか?

その他の注意:

持つcronに関する素晴らしい投稿とリソースはすでにあります。一般的に言えば(これは私が知っている一般的なトピックです)、特定の間隔の始点が私にとってはあまり明確ではありません。さまざまなソースからさまざまな方法で説明します。

  • これunixgeeks.org投稿には次のように記載されています。

    Cronは「ステップ」値もサポートします。 domフィールドの* / 2の値はコマンドが2日ごとに実行されることを意味し、同様に時間フィールドの* / 5の値はコマンドが5時間ごとに実行されることを意味します。

    • それでは何が隠されていますか?本物二日に一度?
  • この回答宣言されたcronjobは、0 0 */2 * *「奇数日00:00に実行されます(ステップ2のデフォルト範囲は1,3,5,7,...,31)。」

    • クローンはいつも毎月1日に始まりますか?
    • ブログには、クローンが31日に実行され、来月1日に再実行されると示されているようです(したがって2日連続)。間隔はその日付の値に基づいているためです。
  • 他の例このブログ投稿から

    • 0 1 1 */2 * command to be executed2ヶ月に1回1日午前1時に実行する必要があります。
    • これは、cronが1、3、5、7、9、11ヶ月で実行されるという意味ですか?

*/3cronは、間隔値を日(または秒、分、時間、または月)の値と比較して間隔cronjob()を実行するように設計されているようです。これは100%正しいですか?

ポリスチレンこれは(私の考えでは)少し説明が必要なcronの特定の機能に関する非常に具体的な質問です。これにより、Googleは「3ヶ月ごとに」クローンがCrontabに追加された後に初めて実行されることを100%確実に伝えることができます。

答え1

これcrontab(5) のマニュアルページ非常に明確な表現を使用してください。

ステップ値は範囲とともに使用できます。 「/number」の後の範囲は、その範囲内の数値をスキップすることを指定します。たとえば、時間フィールドに「0-23/2」を使用して、コマンドを毎時間実行するように指定できます(V7標準の代替は、「0,2,4,6,8,10,12, 14,16, 18,20,22")。アスタリスクの後にもステップが許可されているので、「2時間ごと」と言いたい場合は「*/2」を使用してください。

正確な表現(および例)は、「範囲の数値のスキップ」です。これは、範囲の最初の数字で始まるという意味です。

つまり、範囲が 1 の場合、1-31or の場合、返される値は 1,3,5,7..etc です。これはまた、実行が完了した後に範囲が開始値にリセットされることを意味する。1-31/2*/2

したがって、あなたのコメントも正しいです。この場合、cronjobは来月31日と1日に実行されます。

cronには、「月中の日」と「曜日」という相互に排他的な2つのフィールドがあります。したがって、日数差のあるジョブを実行する場合は、これらのいずれかを選択する必要があります。

隔日で完全に実行されるcronjobを定義するには、複数の行を使用し、現在のカレンダーに基づいて毎月カスタマイズする必要があります。

答え2

今日(2020-07-31)は30に多くの要素があるので、この質問をするのに最適な日です。

(記憶から)私の理解は、(a)*が1から31の範囲に拡張され、(b)/ 3がそのリストのスキップ増分であることです。したがって、3-31/3を書くと、3日、6日、9日、..、27日(2月)または30日(他の月)に実行されます。 man -s 5 crontabはスコープを暗示しますが、デフォルト値以外から始まる例は含まれていません。

スキップした各値に対してcrontabを設定しました(Linux Mint 18.1)。

30 13 */1 * * date > /home/paul/cron.1.log
30 13 */2 * * date > /home/paul/cron.2.log
30 13 */3 * * date > /home/paul/cron.3.log
...
30 13 */30 * * date > /home/paul/cron.30.log
30 13 */31 * * date > /home/paul/cron.31.log

ジャンプが1、2、3、5、6、10、15、30の場合にのみ実行されます。これは (31-1) のすべての要素と同じです。

その後、各範囲を7-31 /に変更して、ジャンプが1、2、3、4、6、8、12、24のときにトリガーしました。これが(31−7)の要素である。

8-31の範囲の場合(31 - 8)は少数なので、ショット1と23だけをスキップします。

答え3

ここで一部のコードを見たい人には、他の回答の結論が確認されます。

cron.hさまざまなタイプ(たとえば、HOUR、MONTH、DAY)の最初と最後の要素を定義します。

#define FIRST_HOUR  0
#define LAST_HOUR   23
#define HOUR_COUNT  (LAST_HOUR - FIRST_HOUR + 1)

#define FIRST_DOM   1
#define LAST_DOM    31
#define DOM_COUNT   (LAST_DOM - FIRST_DOM + 1)

#define FIRST_MONTH 1
#define LAST_MONTH  12
#define MONTH_COUNT (LAST_MONTH - FIRST_MONTH + 1)

存在する入り口.c, '*' は、これらの制限を使用して範囲として解釈されます。

if (ch == '*') {
    /* '*' means "first-last" but can still be modified by /step
     */
    num1 = low;
    num2 = high;

ステップサイズ(num3)のデフォルト値は1ですが、crontabにある場合はオーバーライドできます。

    ch = get_number(&num3, 0, PPC_NULL, ch, file);
    if (ch == EOF)
        return EOF;
} else {
    /* no step.  default==1.
     */
    num3 = 1;

次に、与えられたステップサイズを使用して、最初から最後まで繰り返して、すべての有効な要素を生成します。したがって、最初の要素は常に範囲の始まりです。

/* range. set all elements from num1 to num2, stepping
 * by num3.  (the step is a downward-compatible extension
 * proposed conceptually by bob@acornrc, syntactically
 * designed then implmented by paul vixie).
 */
for (i = num1;  i <= num2;  i += num3)
    if (EOF == set_element(bits, low, high, i))
        return EOF;

関連情報