Jak číst cronový výraz
Cronový výraz je pět hodnot oddělených mezerami, které se zleva doprava čtou jako minuta, hodina, den v měsíci, měsíc a den v týdnu. Úloha se spustí, když aktuální čas odpovídá každému poli.
30 4 * * 1
│ │ │ │ │
│ │ │ │ └── day of week (1 = Monday)
│ │ │ └──── month (any)
│ │ └────── day of month (any)
│ └──────── hour (4am)
└─────────── minute (30)
Tenhle se čte jako „ve 4:30 každé pondělí“.
Pět polí
| # | Pole | Povolené hodnoty | Poznámky |
|---|---|---|---|
| 1 | Minuta | 0 až 59 | |
| 2 | Hodina | 0 až 23 | Dvacetičtyřhodinový formát, 0 je půlnoc |
| 3 | Den v měsíci | 1 až 31 | |
| 4 | Měsíc | 1 až 12, nebo JAN až DEC | |
| 5 | Den v týdnu | 0 až 6, nebo SUN až SAT | 0 je neděle a většina implementací cronu přijímá i 7 |
Některé plánovače používají jiný tvar. Quartz, který používá spousta javového softwaru, dává na první místo sekundy, přidává volitelný rok a dny v týdnu čísluje 1 až 7 počínaje nedělí. Pokud má výraz šest nebo sedm polí, ověřte, pro který systém byl napsán, než svému čtení uvěříte.
Operátory
Jsou čtyři a v rámci jednoho pole se kombinují.
| Symbol | Název | Příklad | Význam |
|---|---|---|---|
* | Cokoli | * * * * * | Každou minutu každého dne |
, | Seznam | 0 9,13,17 * * * | V 9:00, 13:00 a 17:00 |
- | Rozsah | 0 9-17 * * * | Každou hodinu od 9:00 do 17:00 včetně |
/ | Krok | */15 * * * * | V :00, :15, :30 a :45 |
Krok se vždy aplikuje na rozsah. */15 v poli minut znamená „začni na 0 a ber každou patnáctou hodnotu až do 59“. Krokovat můžete i explicitní rozsah: 5-30/10 dá 5, 15 a 25 a pak skončí, protože 35 je už za koncem.
Kroky neznamenají „každých 15 minut od teď“; vybírají pevné hodnoty z ciferníku. */40 se spustí v :00 a :40 a pak čeká jen 20 minut na :00 další hodiny, protože počítání každou hodinu začíná znovu. Seznamy mohou obsahovat rozsahy i kroky, takže 0 0-6/2,12,18-23 * * * je platné pole hodin.
Názvy a zkratky
Pole měsíce a dne v týdnu přijímají třípísmenné názvy a na velikosti písmen nezáleží, takže JAN, jan a Jan jsou totéž. Klasická dokumentace crontabu říká, že rozsahy a seznamy názvů povolené nejsou, i když mnoho moderních implementací MON-FRI přijímá. Pokud si nejste jistí, co vaši úlohu spouští, použijte čísla: 1-5 je jednoznačné všude.
Několik zkratek nahrazuje celý pětipolový výraz:
| Zkratka | Ekvivalent | Kdy běží |
|---|---|---|
@yearly nebo @annually | 0 0 1 1 * | O půlnoci 1. ledna |
@monthly | 0 0 1 * * | O půlnoci 1. dne v měsíci |
@weekly | 0 0 * * 0 | O půlnoci v neděli |
@daily nebo @midnight | 0 0 * * * | Každou půlnoc |
@hourly | 0 * * * * | V celou hodinu |
Existuje také @reboot, ale není to plán: spustí úlohu jednou při startu samotného cronu.
Past dne v měsíci a dne v týdnu
Tohle je ta past, která kouše. Když jsou omezená obě pole, tedy den v měsíci i den v týdnu, což znamená, že ani jedno není *, spustí cron úlohu tehdy, když odpovídá kterékoli z nich, ne když odpovídají obě.
0 0 13 * 5
Mohli byste to číst jako „o půlnoci v pátek třináctého“. Ve skutečnosti to znamená „o půlnoci třináctého každého měsíce a také o půlnoci každý pátek“: přes šedesát spuštění za rok místo jednoho nebo dvou.
Chování AND, které jste čekali, platí jen tehdy, když je jedno z těch dvou polí *. Takže 0 0 * * 5 je každý pátek a 0 0 13 * * je každého třináctého, obojí naprosto normální. Chování OR spouští právě to, že omezíte obě.
V pěti polích neexistuje standardní způsob, jak vyjádřit „pátek třináctého“. Obvyklé obejití je naplánovat každého třináctého a nechat úlohu, aby si před jakoukoli prací ověřila den v týdnu.
Související jemnost: některé implementace rozhodují o tom, jestli je pole omezené, podle toho, jestli doslova začíná znakem *. V nich se 0-6 v poli dne v týdnu počítá jako omezené, i když pokrývá každý den, a tiše zapne chování OR. Když myslíte „cokoli“, použijte *.
Chyby, které se vyplatí zkontrolovat
* */2 * * *běží každou minutu během každé druhé hodiny: 720 spuštění denně. Chtěli jste0 */2 * * *, což je 12.- Chybějící pole minuty posune všechno o jedno doleva a obvykle se to stejně naparsuje, takže dostanete platný plán na úplně jiný čas.
0 0 31 * *tiše přeskočí měsíce, které nemají jedenatřicátého.- Cron používá časové pásmo systému nebo uživatele, pokud vám plánovač nedovolí jedno nastavit. Když se hodiny posouvají kvůli letnímu času, nemusí se úloha ve vynechané hodině spustit vůbec a úloha v opakované hodině se může spustit dvakrát, podle implementace. Úlohy, které se musí spustit jednou denně, je nejbezpečnější naplánovat mimo ty ranní hodiny, kam posun padá.
Když si nejste jistí, přečtěte si výraz nahlas jako větu a pak zkontrolujte několik nejbližších okamžiků, kdy by se skutečně spustil. Pokud ta data nejsou to, co jste popsali, je špatný výraz, ne vaše čtení.