Crontab Guru

Wklej wyrażenie cron i otrzymaj wyjaśnienie pola po polu, w prostym angielskim, co ono robi. Nie musisz pamiętać kolejności pól ani sprawdzać zakresów: Guru przechodzi przez każde z pięciu pól (minuta, godzina, dzień miesiąca, miesiąc i dzień tygodnia) i czyta wyrażenie od lewej do prawej. Przydatne, aby sprawdzić linię crontab przed wdrożeniem lub wyjaśnić linię, którą przejąłeś.

Jak korzystać z Guru

  1. 1

    Wklej wyrażenie

    Skopiuj dowolne standardowe wyrażenie cron z 5 polami (na przykład `0 9 * * 1-5`) do pola wprowadzania.

  2. 2

    Poproś o wyjaśnienie

    Kliknij Explain Cron, a narzędzie zwróci opis każdego pola wiersz po wierszu: minuta, godzina, dzień miesiąca, miesiąc i dzień tygodnia.

  3. 3

    Przeczytaj opis

    Wyjaśnienie jest generowane po angielsku, na przykład "Minute: every 5 minutes" lub "Hour: from 9 through 17."

  4. 4

    Sprawdź przed wdrożeniem

    Użyj wyjaśnienia, aby potwierdzić, że harmonogram robi to, czego chcesz, zanim umieścisz go w crontab, konfiguracji CI lub manifeście Kubernetes.

Ściąga z pól

 ┌───────────── minuta (0-59)
 │ ┌─────────── godzina (0-23)
 │ │ ┌───────── dzień miesiąca (1-31)
 │ │ │ ┌─────── miesiąc (1-12 lub JAN-DEC)
 │ │ │ │ ┌───── dzień tygodnia (0-6 lub SUN-SAT; niedziela = 0 lub 7)
 │ │ │ │ │
 * * * * *

Operatory w wyrażeniach cron

Operator Znaczenie Przykład
* Każda wartość * * * * *
, Lista wartości 0,15,30,45
- Zakres 9-17
/ Krok (początek/krok) */5, 0-30/5
L Ostatni (ostatni dzień miesiąca lub ostatni pasujący dzień tygodnia, Quartz) L, 5L
W Najbliższy dzień roboczy 15W (Quartz)
# N-ty pasujący dzień tygodnia w miesiącu 1#3 (Quartz)
? Brak konkretnej wartości Tylko Quartz

Kolejność czytania ma znaczenie

0 */2 * * 1-5 czyta się od lewej do prawej jako: minuta 0, co 2 godziny, dowolny dzień miesiąca, dowolny miesiąc, od poniedziałku do piątku. Z przyzwyczajenia ludzie czasem czytają pola od prawej do lewej i się gubią; zawsze zaczynaj od minuty.

Pułapka „co X minut”

*/10 * * * * uruchamia się w minutach 0, 10, 20, 30, 40 i 50, a nie „co 10 minut od momentu utworzenia zadania”. Krok w cronie zawsze liczy się od początku zakresu danego pola. Jeśli wdrożysz zadanie o 12:03, pierwsze uruchomienie nastąpi o 12:10, a nie o 12:13.

Dla zadań, które naprawdę wymagają „N minut po ostatnim uruchomieniu”, użyj harmonogramu z trwałym licznikiem czasu (timery systemd z OnUnitActiveSec lub harmonogramowanie na poziomie aplikacji z zapisanym znacznikiem czasu ostatniego uruchomienia).

Pułapki cron, które warto znać

  • Ustawiony jednocześnie dzień miesiąca i dzień tygodnia: większość implementacji crona traktuje to jako zachowanie LUB, czego najpewniej nie chcesz.
  • Krok 0: */0 jest nieprawidłowy.
  • Zakres przechodzący przez północ: 22-2 dla godzin nie działa w klasycznym cronie; użyj 22-23,0-2.
  • 30 lutego: harmonogram w stylu 0 0 30 2 * nigdy się nie uruchomi.
  • Niejednoznaczność czasu letniego (DST): zadania zaplanowane między 2:00 a 3:00 w dni zmiany czasu mogą uruchomić się dwukrotnie albo wcale.

Cron a nowoczesne harmonogramy

Cron z Uniksa jest wciąż wszędzie, ale do czegoś krytycznego prawdopodobnie będziesz potrzebować jednego z tych rozwiązań:

  • Timery systemd: nadrabiają pominięte uruchomienia, obsługują losowe przesunięcia i czytają konfigurację z plików jednostek.
  • Kubernetes CronJob: deklaratywny, z ponawianiem prób, uwzględnia strefy czasowe w wersji 1.25 i nowszych.
  • Airflow / Prefect / Dagster: do zadań z zależnościami, ponawianiem, uzupełnianiem danych (backfill) i obserwowalnością.
  • Harmonogram GitHub Actions: cron z 5 polami, tylko UTC, minimalny odstęp 5 minut, dostarczanie na zasadzie best-effort.

Sam cron to świetny format, ale kiepski harmonogram dla zadań, których nie wolno pominąć.

Najczęściej zadawane pytania

Bo w standardowym cronie dzień tygodnia 0 to niedziela (7 również jest niedzielą, dzięki czemu obsługiwane są obie konwencje). Poniedziałek to 1. Quartz numeruje dni tygodnia od 1 do 7, przy czym niedziela = 1, co często myli osoby przechodzące między różnymi implementacjami.

Klasyczny cron w systemie Unix działa w lokalnej strefie czasowej serwera, czyli tej wskazanej w /etc/timezone. Kubernetes CronJob, GitHub Actions i większość harmonogramów chmurowych domyślnie działa w UTC. Zawsze to sprawdzaj i w miarę możliwości używaj UTC, aby uniknąć niespodzianek związanych z czasem letnim.

Klasyczny cron nie potrafi wyrazić tego bezpośrednio. Obejście: uruchamiaj skrypt w każdy poniedziałek i sprawdzaj datę wewnątrz niego: [ $(date +%d) -le 7 ] && ./job.sh. Quartz obsługuje to natywnie za pomocą 1#1.

Nie. Każdy harmonogram potrzebuje własnej linii. Możesz jednak połączyć kilka pór w jedną linię za pomocą list: 0 9,17 * * * uruchamia się o 9:00 i o 17:00. W przypadku harmonogramów, których nie da się zapisać w jednej linii, dodaj kilka linii wskazujących na to samo polecenie.

Powiązane narzędzia