web-dev-qa-db-ja.com

違いはありますか?および* cron式で?奇妙な例

私のシステムには次のcron式があります。

0 0 0/1 1/1 * ? *

そして、あなたは何を知っていますか?どういう意味かわかりません。それを書いた人は彼の次の2週間の休暇にいるので、私は自分で見つける必要があります。ドキュメントは次の場所にあります ここ

documentation によると:

* * * * * * *
| | | | | | | 
| | | | | | +-- Year              (range: 1970-2099)
| | | | | +---- Day of the Week   (range: 1-7 or Sun-SAT)
| | | | +------ Month of the Year (range: 0-11 or JAN-DEC)
| | | +-------- Day of the Month  (range: 1-31)
| | +---------- Hour              (range: 0-23)
| +------------ Minute            (range: 0-59)
+-------------- Second            (range: 0-59)

わかりました、私が考えていることをお話ししましょう:この表現は以下を意味すると信じています:

start when:
    seconds:        0
    minutes:        0
    hours:          0
    dayOfMonth      1
    monthOfYear     any
    dayOfWeek       any
    year            any

run every:
    1               hour
    1               dayOfWeek
when:
    dayOfWeek same as on first execution

ただし、利用可能なcron式モニターは、それが単に1時間ごとを意味すると言っています。 Senior Java Devであると書いているので、彼は次の代わりにそのような表現を書く理由を知っているはずです:

0 0 * * * * *

org.springframework.scheduling.quartz.QuartzJobBeanを使用します。

短い要約

さて、私の質問は:0 0 0/1 1/1 * ? *0 0 * * * * *の違いは何ですか?

編集:

ドキュメント はここにあります。

17
xenteros

0/1は、時間0から開始し、1時間ごとに繰り返すことを意味します
1/1はその月の最初の日から始まり、1日ごとに実行されます

したがって、このパターンはcronを1時間に1回実行し、月の1日を開始し、毎日繰り返します

dayOfWeekまたはdayOfMonthのいずれかで?を使用する必要があります。
曜日と日付の両方の値を指定するためのサポートは完全ではありません(現在、これらのフィールドの1つで「?」文字を使用する必要があります)。 – 7分前のxenteros

次に、0 0 * * * ? *(および0 0 * * * *ではなく、コメントした?は必須)は同じ式になります。秒と分を無視して、他の要素の各値を取得し、毎時および毎日実行します。


あなたの情報によると:

0 0 0/1 1/1 * ? *
| |  |   |  | | | 
| |  |   |  | | +-- Year              (range: 1970-2099)
| |  |   |  | +---- Day of the Week   (range: 1-7 or Sun-SAT)
| |  |   |  +------ Month of the Year (range: 0-11 or JAN-DEC)
| |  |   +--------- Day of the Month  (range: 1-31)
| |  +------------- Hour              (range: 0-23)
| +---------------- Minute            (range: 0-59)
+------------------ Second            (range: 0-59)

そして この説明 の特殊文字:

*(「すべての値」)

フィールド内のすべての値を選択するために使用されます。たとえば、分フィールドの「」は*「毎分」を意味します。

?(「特定の値なし」)

文字が許可されている2つのフィールドのいずれかで何かを指定する必要があるが、もう一方は指定できない場合に役立ちます。たとえば、月の特定の日(たとえば、10日)にトリガーを起動したいが、何の曜日かは気にしない場合は、曜日に「10」を入れます。 -月フィールド、および「?」曜日フィールド。

/

増分を指定するために使用されます。たとえば、秒フィールドの「0/15」は「秒0、15、30、45」を意味します。また、秒フィールドの「5/15」は、「秒5、20、35、50」を意味します。また、「」文字の後に「/」を指定することもできます。この場合、「」は「/」の前に「0」があることと同じです。 「日」フィールドの「1/3」は、「月の最初の日から3日ごとに起動する」ことを意味します。


*?の違い

式の中の?*の違いを説明するために、最初に次の表を見てください。

Field Name      Mandatory   Allowed Values      Allowed Special Characters
Seconds         YES         0-59                , - * /
Minutes         YES         0-59                , - * /
Hours           YES         0-23                , - * /
Day of month    YES         1-31                , - * ? / L W   //allowed '?'
Month           YES         1-12 or JAN-DEC     , - * /
Day of week     YES         1-7 or Sun-SAT      , - * ? / L #   //allowed '?'
Year            NO          empty, 1970-2099    , - * /

ご覧のとおり、?Day of monthでのみ許可され、Day of weekは両方のフィールドのいずれかで必須であり、この値が定義されていないことをQuartzに通知するため、他のフィールドを使用します( ?Day of monthに入れると、使用される値はDay of weekになります。

23
joc

0 0 * * * ? *0 0 0/1 1/1 * ? *の間に実質的な違いはありません

異なるマークの分析:
0/1*は数時間-最初は毎日0時間から始まり、毎時間繰り返す、2番目は1時間ごとに繰り返す
1/1および*(日数)-fisrtは月の最初の日から始まり、毎日繰り返すことを意味し、2番目は毎日を意味します。

誰かが複雑な式を使用した理由は、テストによって式がこのフォームに評価され、誰もそれを簡略化する仕事を引き受けなかった、または以前のcronバージョンが異なって機能したためであると考えられます。

2
Javoslaw

答えではなく、@ jocの正しい答えを更新しただけです。

今のところ、 QuartzScheduler具体的に?は、次の2つの位置のいずれかに適用できます:day_of_monthまたはday_of_week

曜日と日付の両方の値を指定するためのサポートは完全ではありません(現在、これらのフィールドの1つで「?」文字を使用する必要があります)。

上記のリンクのほかにも、独自の方法を思い付くのに十分なガイドとなる多くの例があります。


+--------------------+-------------------------------------------------------------------------------------------------------------------------------------+
|   **Expression**   |                                                             **Meaning**                                                             |
+--------------------+-------------------------------------------------------------------------------------------------------------------------------------+
| 0 0 12 * * ?       | Fire at 12pm (noon) every day                                                                                                       |
| 0 15 10 ? * *      | Fire at 10:15am every day                                                                                                           |
| 0 15 10 * * ?      | Fire at 10:15am every day                                                                                                           |
| 0 15 10 * * ? *    | Fire at 10:15am every day                                                                                                           |
| 0 15 10 * * ? 2005 | Fire at 10:15am every day during the year 2005                                                                                      |
| 0 * 14 * * ?       | Fire every minute starting at 2pm and ending at 2:59pm, every day                                                                   |
| 0 0/5 14 * * ?     | Fire every 5 minutes starting at 2pm and ending at 2:55pm, every day                                                                |
| 0 0/5 14,18 * * ?  | Fire every 5 minutes starting at 2pm and ending at 2:55pm, AND fire every 5 minutes starting at 6pm and ending at 6:55pm, every day |
+--------------------+-------------------------------------------------------------------------------------------------------------------------------------+

0
Hearen