Utilia

Generátor výrazů cron

Sestav výraz cron pole po poli, přečti si ho lidsky, zobraz další termíny spuštění v libovolném časovém pásmu a převeď ho do formátu systemd, Quartz nebo AWS.

Konstruktor

PoleRežimHodnota
Minuta0–59
Hodina0–23
Den v měsíci1–31, L
Měsíc1–12 nebo JAN–DEC
Den v týdnu0–7 (0 a 7 = neděle) nebo SUN–SAT

Jak sestavit výraz cron

  1. Napiš nebo vlož výraz do pole Výraz cron, nebo ho vyber v Předvolbách. Přijímají se i makra jako @daily nebo @weekly.
  2. Nebo použij Konstruktor: pro každé pole zvol Režim (Každý, Každých N, Konkrétní hodnoty, Rozsah nebo Vlastní) a vyplň Hodnotu. Výraz se průběžně aktualizuje a úprava výrazu aktualizuje konstruktor.
  3. Zaškrtni Přidat pole sekund (6 polí), pokud tvůj plánovač sekundy podporuje.
  4. Přečti si plán v části Lidsky řečeno (v jazyce stránky, protože knihovna s popisy češtinu podporuje) a zkontroluj seznam Další spuštění. Zvol Časové pásmo serveru, na kterém úloha běží, a Kolik spuštění vypsat.
  5. Výraz zkopíruj tlačítkem Kopírovat, nebo použij některý z Jiných formátů.

Chyby se vysvětlují pole po poli, například „Minuta: 61 je mimo rozsah (0–59)“, takže přesně víš, co opravit.

Pět polí cronu

Standardní řádek cronu (Vixie) má pět polí a poté příkaz:

Pole Povolené hodnoty
Minuta 0–59
Hodina 0–23
Den v měsíci 1–31
Měsíc 1–12 nebo JAN–DEC
Den v týdnu 0–7 (0 a 7 jsou neděle) nebo SUN–SAT

Každé pole přijímá * (každou hodnotu), seznam 1,15, rozsah 9-17, krok */15 (každých 15 jednotek) nebo rozsah s krokem 0-30/10. Výraz */15 9-17 * * 1-5 tedy znamená každých 15 minut od 9:00 do 17:45, od pondělí do pátku.

Jedno pravidlo mnohé překvapí: když jsou omezeny Den v měsíci i Den v týdnu, klasický cron se spustí, když platí kterékoli z nich. 0 0 13 * 5 se spustí každého 13. a také každý pátek, nikoli jen v pátek 13. V takovém případě nástroj zobrazí upozornění.

Další termíny spuštění a časová pásma

Cron používá hodiny počítače nebo nastavení CRON_TZ/TZ v crontabu. Seznam Další spuštění se počítá pro zvolené časové pásmo včetně změn letního času: při jarní změně může být úloha nastavená na 2:30 přeskočena a na podzim se podle implementace spustí jednou nebo dvakrát. U úloh, které se musí spustit právě jednou, upřednostni časy mimo 1:00–3:00 nebo použij UTC.

Vixie cron, časovače systemd, Quartz a AWS

  • Časovače systemd používají OnCalendar= s odlišnou syntaxí: Mon..Fri *-*-* 09..17:00/15:00. Podmínky dne v týdnu a data se spojují operátorem AND, nikoli OR, takže některé výrazy cron nemají přesný ekvivalent.
  • Quartz a Spring dávají na začátek pole sekund a mohou přidat pole roku. Jedno ze dvou polí dne musí být ? a Quartz číslují dny v týdnu 1–7 od neděle, na rozdíl od cronu 0–6. Nástroj proto zapisuje dny v týdnu jako názvy (MON-FRI), aby se té pasti vyhnul.
  • AWS EventBridge používá cron(minuty hodiny den měsíc den_v_týdnu rok): šest polí, bez sekund, s ? v jednom z polí dne a s rokem na konci.

Standardní cron pole sekund nemá. Šestipolní tvar se sekundami podporuje mnoho knihoven (node-cron, Spring, Quartz), ale systémový crontab ne.

Časté dotazy

Jak spustit úlohu každých 5 minut?

Použij */5 * * * *. Úloha se spustí v minutách 0, 5, 10… každé hodiny.

Jak spustit úlohu poslední den v měsíci?

Mnoho plánovačů přijímá v poli dne v měsíci L: 0 18 L * *. U čistého Vixie cronu spouštěj úlohu denně ve dnech 28–31 a ve skriptu testuj, zda zítřek je 1.

Co dělá @reboot?

Spustí příkaz jednou, při startu démona cron. Nemá žádný plán, takže pro něj nástroj nemůže vypsat termíny spuštění.

Proč se moje úloha nespouští v zobrazenou dobu?

Zkontroluj časové pásmo serveru, crontab uživatele oproti /etc/crontab (ten má navíc pole uživatele) a proměnnou PATH: cron startuje s minimálním prostředím.

Je neděle 0, nebo 7?

Obojí. V poli dne v týdnu znamenají 0 a 7 neděli, 1 je pondělí a 6 sobota.