§

Wpisz wyrażenie cron lub wybierz szablon poniżej.

Szybkie szablony:
§

10 kolejnych uruchomień

cron

Harmonogram w czytelnej formie pojawi się tutaj...

    §

    Kreator wyrażenia

    Deweloperzy pracujący w polskim ekosystemie chmurowym napotykają składnię cron na każdej warstwie stosu. AWS EventBridge Scheduler przyjmuje ją do wyzwalaczy Lambda, zasoby Kubernetes CronJob używają tego samego pięciopolowego formatu na każdym klastrze EKS, a GitHub Actions wczytuje ją wprost z `.github/workflows/*.yml`. Pułapka polega na tym, że żadna z tych platform nie zgadza się co do krawędzi. EventBridge dodaje szóste pole dla roku i wymaga `?` zamiast `*` w jednym z pól dnia. Kubernetes działa w UTC, chyba że jawnie ustawisz `spec.timeZone`. GitHub Actions działa w UTC bez żadnej możliwości zmiany. To narzędzie parsuje dowolny wariant, który wkleisz, pokazuje dziesięć kolejnych uruchomień w wybranej strefie IANA i pozwala budować nowe wyrażenie pole po polu, by sprawdzić harmonogram przed wdrożeniem na produkcję.

    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:

    1. Minuta (0–59). Która minuta godziny zadanie się uruchamia. 0 oznacza pełną godzinę, 30 — w połowie, */5 — co pięć minut (00, 05, 10, ...), a 15,45 — kwadrans po i kwadrans do.
    2. Godzina (0–23). Która godzina dnia w formacie 24-godzinnym. 0 to północ, 9 to 9:00, 17 to 17:00. Zakresy (9-17 dla godzin roboczych) i wartości krokowe (*/2 co drugą godzinę) działają tak samo jak w minutach.
    3. Dzień miesiąca (1–31). Który dzień kalendarzowy uruchomić. 1 oznacza 1. dzień miesiąca, * każdy dzień, 1,15 — 1. i 15. Uważaj z 31 — cicho pomija miesiące niemające 31 dni.
    4. 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.
    5. Dzień tygodnia (0–7, gdzie zarówno 0, jak i 7 to niedziela). Ogranicza uruchamianie do wybranych dni tygodnia. 1-5 to poniedziałek–piątek, 0,6 to weekend, PON-PT dział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.