Cron výrazy odhaleny: naplánujte cokoli
Potřebujete spouštět zálohu databáze každou noc ve 3 hodiny. Nebo odesílat report každé pondělí ráno. Nebo mazat cache každých 15 minut. Na Linuxových a Unixových serverech je nástrojem pro toto cron a způsob, jak říct cronu, kdy co spustit, je cron výraz.
Cron výrazy na první pohled vypadají děsivě. 0 3 * * * nebo */15 9-17 * * 1-5 může znít jako nesmysl, pokud neznáte vzor. Ale syntaxe je překvapivě jednoduchá, jakmile pochopíte pět polí.
Pět polí
Každý standardní cron výraz má přesně pět polí oddělených mezerami. Každé pole představuje časovou jednotku:
┌───────────── minuta (0-59)
│ ┌───────────── hodina (0-23)
│ │ ┌───────────── den v měsíci (1-31)
│ │ │ ┌───────────── měsíc (1-12)
│ │ │ │ ┌───────────── den v týdnu (0-7, kde 0 a 7 jsou neděle)
│ │ │ │ │
* * * * *
To je vše. Pět polí zleva doprava: minuta, hodina, den v měsíci, měsíc, den v týdnu.
Věděli jste? Název „cron" pochází z řeckého slova „chronos" znamenajícího čas. Daemon cronu (proces běžící na pozadí) je součástí Unixových operačních systémů od roku 1975.
Speciální znaky
Hvězdička (*) — každá hodnota
Hvězdička znamená „každou možnou hodnotu" pro dané pole.
* * * * * = každou minutu každé hodiny každého dne.
Čárka (,) — více hodnot
Čárka odděluje jednotlivé hodnoty.
0 9,12,18 * * * = v minutě 0 hodin 9, 12 a 18 (9:00, 12:00, 18:00).
Pomlčka (-) — rozsah hodnot
Pomlčka definuje rozsah.
0 9-17 * * * = v minutě 0 každé hodiny od 9 do 17 (9:00 až 17:00, každou hodinu).
Lomítko (/) — krokové hodnoty
Lomítko definuje intervaly.
*/15 * * * * = každých 15 minut (minuta 0, 15, 30, 45 každé hodiny).
0 */2 * * * = každé 2 hodiny v minutě 0 (půlnoc, 2:00, 4:00, ...).
Čtení cron výrazů: procvičení
Projdeme si běžné příklady. U každého čtěte pět polí zleva doprava.
0 3 * * * — každý den ve 3:00
| Pole | Hodnota | Význam |
|---|---|---|
| Minuta | 0 | V minutě 0 |
| Hodina | 3 | Hodiny 3 (3:00) |
| Den v měsíci | * | Každý den |
| Měsíc | * | Každý měsíc |
| Den v týdnu | * | Každý den v týdnu |
Překlad: „Ve 3:00 každý den." Klasická volba pro noční zálohy.
*/15 * * * * — každých 15 minut
| Pole | Hodnota | Význam |
|---|---|---|
| Minuta | */15 | Každých 15 minut |
| Hodina | * | Každou hodinu |
| Den v měsíci | * | Každý den |
| Měsíc | * | Každý měsíc |
| Den v týdnu | * | Každý den |
Překlad: „Každých 15 minut nepřetržitě." Běžné pro kontroly stavu a obnovu cache.
0 9 * * 1-5 — pracovní dny v 9:00
| Pole | Hodnota | Význam |
|---|---|---|
| Minuta | 0 | V minutě 0 |
| Hodina | 9 | Hodiny 9 |
| Den v měsíci | * | Každý den |
| Měsíc | * | Každý měsíc |
| Den v týdnu | 1-5 | Pondělí až pátek |
Překlad: „V 9:00, pondělí až pátek." Ideální pro denní pracovní reporty.
0 0 1 * * — první den každého měsíce
| Pole | Hodnota | Význam |
|---|---|---|
| Minuta | 0 | V minutě 0 |
| Hodina | 0 | Hodiny 0 (půlnoc) |
| Den v měsíci | 1 | Prvního |
| Měsíc | * | Každý měsíc |
| Den v týdnu | * | Jakýkoli den v týdnu |
Překlad: „O půlnoci prvního dne každého měsíce." Používá se pro měsíční reporty, fakturaci nebo úklid.
30 8 * * 1 — pondělky v 8:30
| Pole | Hodnota | Význam |
|---|---|---|
| Minuta | 30 | V minutě 30 |
| Hodina | 8 | Hodiny 8 |
| Den v měsíci | * | Každý den |
| Měsíc | * | Každý měsíc |
| Den v týdnu | 1 | Pondělí |
Překlad: „V 8:30 každé pondělí." Skvělé pro týdenní týmová oznámení.
Psaní vlastních cron výrazů
Zde je systematický přístup:
- Začněte s otázkou kdy. „Každý den ve 3:00" nebo „každých 5 minut v pracovní době."
- Vyplňte pole zleva doprava. Začněte minutou, pak hodinou, pak dnem v měsíci, pak měsícem, pak dnem v týdnu.
- Použijte
*pro „každý." Pokud vám na poli nezáleží, použijte*. - Testujte před nasazením. Vždy ověřte, že výraz produkuje plán, který očekáváte.
Rychlá reference běžných vzorů
| Plán | Výraz |
|---|---|
| Každou minutu | * * * * * |
| Každých 5 minut | */5 * * * * |
| Každou hodinu | 0 * * * * |
| Každý den o půlnoci | 0 0 * * * |
| Každý den ve 3:00 | 0 3 * * * |
| Každé pondělí v 9:00 | 0 9 * * 1 |
| Pracovní dny v 8:30 | 30 8 * * 1-5 |
| Prvního každého měsíce | 0 0 1 * * |
| Každých 15 min, pracovní doba | */15 9-17 * * 1-5 |
| Dvakrát denně (9:00 a 18:00) | 0 9,18 * * * |
| Každou neděli ve 2:00 | 0 2 * * 0 |
Časté chyby
Zapomenutí, že hodiny jsou 0–23
Hodina 13 je 13:00, nikoli 1:00. Běžná chyba je napsat 0 1 * * * v přesvědčení, že se spustí ve 13:00, zatímco se spustí ve 1:00.
Záměna dní v týdnu
Neděle může být 0 nebo 7 (obojí je platné). Pondělí je 1, sobota je 6. Někteří čekají, že pondělí je 0.
Interakce dne v měsíci a dne v týdnu
Pokud zadáte den v měsíci i den v týdnu (ani jedno není *), většina implementací cronu spustí úlohu, když je splněna kterákoli podmínka, nikoli obě zároveň. To mnohé překvapí.
Varování Výraz 0 9 15 * 1 NEZNAMENÁ „v 9:00 patnáctého, ale pouze pokud je pondělí." Znamená „v 9:00 patnáctého každého měsíce A v 9:00 každé pondělí." Toto je častý zdroj neočekávaného chování.
Povědomí o časových pásmech
Cron běží v místním časovém pásmu serveru. Pokud je váš server v UTC a vy jste v Praze (UTC+1 nebo +2 v létě), cron úloha 0 9 * * * se spustí v 10:00 nebo 11:00 vašeho místního času. Vždy zkontrolujte časové pásmo serveru.
Tip Testujte a vizualizujte cron výrazy před nasazením: Jak číst a testovat cron výrazy. Prohlédněte si časy příštích spuštění a potvrďte, že plán odpovídá vašemu záměru.
Sestavujte a testujte cron výrazy:
Zdarma, okamžitě a bez registrace.