Czym jest wyrażenie cron?
Wyrażenie cron to zwarty ciąg harmonogramujący, który mówi planistowi zadań dokładnie, kiedy uruchomić zadanie. Format narodził się w 1975 roku w demonie cron Unix V7 i od tamtej pory prawie się nie zmienił — ta sama pięciopolowa gramatyka pojawia się dziś w Kubernetes CronJobs, AWS EventBridge, przepływach pracy GitHub Actions, Google Cloud Scheduler, GitLab CI, pipeline’ach Jenkinsa oraz w narzędziu crontab dostarczanym z każdą dystrybucją Linuxa. Gramatyka ta w zaledwie kilkunastu znakach zawiera dużo znaczenia, dlatego parser przekształcający ją na zwykły tekst to różnica między pewnym wdrożeniem a cofnięciem o 3 w nocy.
Jak działa wyrażenie cron?
Standardowe wyrażenie cron ma pięć pól oddzielonych spacjami, które razem definiują powtarzający się harmonogram. Silnik sprawdza bieżący zegar względem wyrażenia co minutę i uruchamia zadanie, gdy wszystkie pięć pól pasuje. Pola od lewej do prawej:
- Minuta (0–59). Która minuta godziny zadanie się uruchamia.
0oznacza pełną godzinę,30— w połowie,*/5— co pięć minut (00, 05, 10, ...), a15,45— kwadrans po i kwadrans do. - Godzina (0–23). Która godzina dnia w formacie 24-godzinnym.
0to północ,9to 9:00,17to 17:00. Zakresy (9-17dla godzin roboczych) i wartości krokowe (*/2co drugą godzinę) działają tak samo jak w minutach. - Dzień miesiąca (1–31). Który dzień kalendarzowy uruchomić.
1oznacza 1. dzień miesiąca,*każdy dzień,1,15— 1. i 15. Uważaj z31— cicho pomija miesiące niemające 31 dni. - Miesiąc (1–12 lub STY–GRU). Które miesiące uruchomić.
*oznacza każdy miesiąc,1,7— styczeń i lipiec,1-3— tylko I kwartał. Trzyliterowe skróty miesięcy są niezależne od wielkości liter w większości implementacji. - Dzień tygodnia (0–7, gdzie zarówno 0, jak i 7 to niedziela). Ogranicza uruchamianie do wybranych dni tygodnia.
1-5to poniedziałek–piątek,0,6to weekend,PON-PTdziała w większości parserów. Gdy zarówno dzień miesiąca, jak i dzień tygodnia mają konkretne wartości, klasyczny cron uruchamia się przy każdym dopasowaniu (logiczne LUB) — co każdego zaskakuje.
Dlaczego warto używać parsera wyrażeń cron?
- Złap ciche pomyłki przed wdrożeniem. Wyrażenie `0 2 */3 * *` uruchamia się o 2:00 co trzeci dzień, nie co trzy minuty — wklej je tutaj, a zobaczysz to po polsku zanim trafi na produkcję.
- Większość harmonogramerów chmurowych działa domyślnie w UTC. Podgląd dziesięciu kolejnych uruchomień w lokalnej strefie ujawnia przesunięcie o godzinę spowodowane czasem letnim, zanim obudzi kogoś o 3 w nocy.
- Skróty takie jak `@daily`, `@weekly` i `@monthly` są wygodne, ale niejednoznaczne. Parser pokazuje bazową pięciopolową postać, dzięki czemu wiesz dokładnie, co zostało zaplanowane.
- Kreator pole po polu pozwala budować harmonogram kolumna po kolumnie i obserwować aktualizację opisu na żywo — to znacznie szybsze niż dziesiąte czytanie strony podręcznika cron.
Gdzie używa się wyrażeń cron?
Składnia cron pojawia się wszędzie tam, gdzie zadanie musi się powtarzać według zegara. Trzy najpopularniejsze zastosowania z typową pułapką każdego:
- Harmonogramy kopii zapasowych. Klasyczny wpis `crontab -e` zrzucający bazę danych do S3 o 2:00 w nocy lub rotujący archiwum `pg_dump` pierwszego dnia każdego miesiąca. Wiersz taki jak `0 2 * * * /usr/local/bin/backup.sh` jest na więcej serwerach Linux niż jakikolwiek inny wiersz cron w historii. Ustaw minutę i godzinę poprawnie, przekieruj stderr w trwałe miejsce, a zastąpisz ręczną listę kontrolną skryptem uruchamiającym się samoczynnie.
- Wyzwalacze `schedule` w GitHub Actions. Klucz `on.schedule.cron` w `.github/workflows/*.yml` przyjmuje standardowy pięciopolowy cron, ale zadanie zawsze działa w UTC, a GitHub po cichu pomija uruchomienie, gdy kolejka runnerów jest zajęta. Typowy wzorzec: `cron: '0 9 * * 1-5'` aby wysyłać codzienny digest w dni robocze o 9:00 UTC. Podglądaj go tutaj w swojej lokalnej strefie, żeby nie obiecać digestu o 9:00, który faktycznie dociera o 10:00 czasu letniego.
- AWS EventBridge Scheduler. Wyrażenia cron EventBridge mają szóste pole dla roku i wymagają `?` zamiast `*` w polu dzień-miesiąca lub dzień-tygodnia — `cron(0 9 ? * MON-FRI *)` to odpowiednik klasycznego cron na dni robocze o 9:00 dla EventBridge. Używane do cyklicznych wywołań Lambda, uruchomień zadań ECS i startów maszyn stanowych Step Function; niezgodność ze składnią klasycznego cron to główna przyczyna błędów `ValidationException` w wdrożeniach CloudFormation.
Jak wygląda prawdziwe wyrażenie cron?
Weź 0 9 * * 1-5 — uruchamia się o 9:00 w każdy dzień roboczy. Czytając pola od lewej: 0 to zerowa minuta godziny, 9 to godzina 9 w formacie 24-godzinnym, * w dzień-miesiąca oznacza każdy dzień kalendarzowy, * w miesiąc oznacza każdy miesiąc, a 1-5 w dzień-tygodnia ogranicza uruchamianie do poniedziałku–piątku (gdzie 1 = poniedziałek w standardowej numeracji cron). Wklej to do pola powyżej, a parser potwierdzi O 09:00, od poniedziałku do piątku wraz z dziesięcioma kolejnymi datami uruchomień w wybranej strefie IANA. Ten sam zamiar w składni AWS EventBridge to cron(0 9 ? * MON-FRI *) — zauważ pole roku na końcu i ? tam, gdzie standardowy cron użyłby *. Ten sam zamiar jako wyrażenie Quartz (sześciopolowe z wiodącymi sekundami) to 0 0 9 ? * MON-FRI. Trzy różne platformy, trzy różne postacie, jeden harmonogram.
Wyrażenia cron są bezlitosne dokładnie w jeden sposób: literówka daje poprawny składniowo harmonogram, który uruchamia się o złej porze — bez żadnego błędu do wychwycenia w code review. Odczytanie `0 0 1 * *` i wiedza, że działa o północy pierwszego dnia każdego miesiąca, a nie 1 stycznia, wymaga praktyki. Parser powyżej zamienia tę praktykę w dziesięciosekundową weryfikację — wklej wyrażenie, przeczytaj po polsku, przejrzyj dziesięć kolejnych uruchomień w swojej strefie i zatwierdź YAML, wiedząc, że wiersz cron faktycznie robi to, co mówi wiadomość commita.
Jaka jest różnica między cron 5-polowym a 6-polowym?
Pięciopolowy cron to klasyczna gramatyka Unix z rozdzielczością jednej minuty. Sześciopolowy cron dodaje kolumnę sekund dla harmonogramowania z dokładnością poniżej minuty — używane przez Quartz i `@Scheduled` Springa. AWS EventBridge też używa sześciu pól, ale dodatkowa kolumna to rok, a nie sekundy.
Co oznaczają @hourly, @daily i @weekly?
Pseudonimy Vixie-cron wprowadzone w 1987 roku. @hourly = 0 * * * *, @daily = 0 0 * * *, @weekly = 0 0 * * 0, @monthly = 0 0 1 * *, @yearly = 0 0 1 1 *. @reboot uruchamia się raz przy starcie systemu. GitHub Actions i EventBridge nie obsługują tych aliasów.
Czy niedziela to dzień 0 czy 7 w cronie?
Oba, w klasycznym Vixie cron — akceptowane są zarówno 0, jak i 7, aby zakresy takie jak 5-7 naturalnie czytały się jako piątek–niedziela. Poniedziałek to zawsze 1, sobota zawsze 6. Quartz i AWS EventBridge używają innej konwencji: 1-7 z niedzielą jako 1. Sprawdź dokumentację platformy, zanim przyjmiesz cokolwiek za pewnik.
Jak cron radzi sobie z czasem letnim?
Zależy od strefy czasowej silnika. W UTC (domyślnie na EventBridge, Kubernetes i GitHub Actions) czas letni nie istnieje. W lokalnej strefie z DST klasyczny Vixie cron pomija zadania podczas przestawienia zegarów do przodu i uruchamia je dwukrotnie przy cofnięciu; timery systemd uruchamiają się dokładnie raz.