Preskočiť na obsah

Syntax cron výrazov

Cron výraz je päť polí, ktoré opisujú, kedy sa má niečo spustiť. Každé pole hovorí, ktoré hodnoty svojej jednotky sú prípustné, a úloha sa spustí v každej minúte, na ktorej sa všetkých päť zhodne. To je celý model: neexistuje trvanie, neexistuje „každých 90 minút“ a nikde sa neuchováva stav ďalšieho spustenia.

Polia sa čítajú zľava doprava ako minúta, hodina, deň v mesiaci, mesiac, deň v týždni. Príklady dole sú tie, po ktorých ľudia naozaj siahajú, a každý z nich pred zostavením tejto stránky prejde vlastným cron parserom tejto stránky.

Posledná sekcia uvádza syntax, ktorá vyzerá ako cron, no tu sa neprijíma: rozšírenia Quartzu a Jenkinsu a šesťpoľový tvar so sekundami. Oplatí sa ich poznať, lebo skopírovaný výraz, ktorý niektoré z nich používa, jednoducho zlyhá.

Päť polí

7

Cron riadok tvorí päť polí oddelených medzerami a za nimi príkaz. Každé pole musí byť prítomné; vynechať sa nedá žiadne.

VýrazRozsahVýznam
* * * * *min hod dom mes dowPäť polí v poradí: minúta, hodina, deň v mesiaci, mesiac, deň v týždniPäť hviezdičiek znamená každú minútu každého dňa — najvoľnejší možný zápis.
minute0-59Prvé pole
hour0-23Druhé pole, v 24-hodinovom formáte
day of month1-31Tretie poleDeň, ktorý v danom mesiaci neexistuje, sa jednoducho preskočí — 31 sa spustí sedemkrát do roka, nie dvanásťkrát.
month1-12Štvrté pole
day of week0-7Piate pole, nedeľa ako prváNedeľu znamená 0 aj 7 — preto rozsah končí sedmičkou, nie šestkou.
0 5 13 * 5Keď sú obmedzené obe polia dní, cron sa spustí pri ktoromkoľvek z nich — nie pri oboch narazToto beží 13. a zároveň každý piatok, takže to nie je „piatok trinásteho“. Je to jediné pravidlo cronu, ktoré prekvapí každého.

Operátory

10

Rovnaké štyri operátory fungujú v každom poli; mení sa len rozsah čísel, ktoré prijímajú.

VýrazRozsahVýznam
*Každá hodnota, ktorú pole pripúšťa
1,15,30Zoznam jednotlivých hodnôt
9-17Rozsah vrátane oboch koncov
*/15Každá n-tá hodnota v celom poli*/15 v poli minút znamená :00, :15, :30 a :45 — počíta sa od začiatku rozsahu, nie od aktuálneho času.
9-17/2Každá n-tá hodnota v rámci rozsahu
5/10Každá n-tá hodnota od východiskového bodu po koniec poľa
0,30 9-17 * * 1-5Operátory sa dajú ľubovoľne kombinovať v ktoromkoľvek poliKaždú celú a pol hodinu, medzi deviatou a piatou, od pondelka do piatka.
JAN-DEC1-12Názvy mesiacov, tri písmená, nezáleží na veľkosti
SUN-SAT0-6Názvy dní, tri písmená, nezáleží na veľkosti
70Nedeľa, zapísaná tým druhým spôsobom

Skrátené makrá

7

Sedem názvov, ktoré zastupujú celý výraz. Sú vlastnosťou formátu crontab, nie gramatiky polí — plánovač, ktorý číta cron reťazce, ich teda nemusí prijímať.

VýrazRozsahVýznam
@hourly0 * * * *Vždy na začiatku hodiny
@daily0 0 * * *Raz denne o polnoci
@midnight0 0 * * *To isté ako @daily
@weekly0 0 * * 0Raz týždenne, v nedeľu o polnoci
@monthly0 0 1 * *Prvého v mesiaci o polnoci
@yearly0 0 1 1 *Prvého januára o polnoci
@annually0 0 1 1 *To isté ako @yearly

Príklady

14

Keď výraz prestane dávať zmysel, čítajte ho sprava doľava: najhrubšie pole je vpravo a rozhoduje o tom, v ktoré dni sa jemnejšie polia vôbec vyhodnocujú.

VýrazRozsahVýznam
* * * * *Každú minútu
*/5 * * * *Každých päť minút
0 * * * *Každú hodinu, vždy na jej začiatku
0,30 * * * *Každú pol hodinu
0 3 * * *Každý deň o 03:00
0 9,17 * * *Dvakrát denne, o 09:00 a 17:00
*/15 9-17 * * 1-5Každú štvrťhodinu počas pracovných hodín v pracovné dni
0 8 * * 1-5V pracovné dni o 08:00
0 10 * * 6,0V sobotu a nedeľu o 10:00
30 7 * * MONV pondelok o 07:30
0 0 1 * *O polnoci prvého dňa každého mesiaca
0 0 28-31 * *Každý deň v poslednej časti mesiacaŠtandardný cron nepozná „posledný deň mesiaca“. Tento zápis sa spustí až štyrikrát; bežné riešenie je skript, ktorý si overí dátum a hneď skončí.
0 0 1 1,4,7,10 *O polnoci prvého dňa každého štvrťroka
0 0 1 1 *Raz ročne, na začiatku 1. januára

Rozšírenia, ktoré táto stránka neprijíma

6

Pridávajú ich Quartz, Jenkins a niektoré cloudové plánovače. Sú tu uvedené preto, aby ste ich spoznali v cudzom crontabe — parser na tejto stránke každý z nich odmietne, rovnako ako cron dodávaný s Linuxom.

VýrazRozsahVýznam
?„Žiadna konkrétna hodnota“ v tom poli dňa, ktoré už obmedzuje to druhé
LPosledný deň mesiaca alebo posledný daný deň v týždni
15WPracovný deň najbližší k 15.
FRI#3Tretí piatok v mesiaci
*/30 * * * * *Šieste pole pre sekundy, vpreduŠesť polí, nie päť. Tento tvar používa Quartz a viacero knižníc; súbor crontab nie.
@rebootSpustiť raz pri štarte strojaV crontabe existuje, ale nie je to rozvrh — neexistuje ďalšie spustenie, ktoré by sa dalo vypočítať, a preto ho tunajší parser odmieta.

Časté otázky

Prečo sa moja úloha na „piatok trinásteho“ spúšťala každý piatok?
Pretože keď sú obmedzené obe polia — deň v mesiaci aj deň v týždni — cron ich berie ako alebo, nie ako a zároveň. 0 5 13 * 5 sa spustí 13. a zároveň každý piatok. Skutočný piatok trinásteho si vyžaduje kontrolu dátumu priamo v skripte.
Znamená */5 „o päť minút od teraz“?
Nie. Kroky sa počítajú od začiatku rozsahu poľa, nie od chvíle, keď úlohu nainštalujete, takže */5 v poli minút znamená :00, :05, :10 a tak ďalej — bez ohľadu na to, kedy bol výraz napísaný.
Aké časové pásmo cron používa?
Systémové, pokiaľ crontab hore nenastaví CRON_TZ alebo TZ. Dvakrát do roka to má následky: úloha naplánovaná v hodine, ktorú prechod na letný čas preskočí, sa nespustí, a úloha v hodine, ktorá sa zopakuje, môže bežať dvakrát.
Je 0 to isté ako 7 v poli dňa v týždni?
Áno, obe znamenajú nedeľu. Duplikát existuje preto, aby sa rozsah 1-7 pokrývajúci pondelok až nedeľu dal napísať prirodzene, čo pole 0-6 jedným rozsahom vyjadriť nevie.
Kde si môžem výraz otestovať?
Cron parser na tejto stránke prijme výraz a zobrazí najbližšie spustenia bežnou rečou, lokálne vo vašom prehliadači. Nástroj vedľa neho ide opačným smerom: vyberiete rozvrh a on napíše výraz.