Oblicz najbliższe wykonania wyrażenia cron

analizuje wyrażenie cron i wyświetla najbliższe daty wykonania

Czym jest wyrażenie cron?

Wyrażenie cron to krótki ciąg, który opisuje rekurencję w czasie. Format odziedziczony po Unix mieści się w pięciu polach oddzielonych spacjami: minuta, godzina, dzień miesiąca, miesiąc i dzień tygodnia. Ta składnia narodziła się wraz z demonem cron Briana Kernighana w latach 70., następnie została uogólniona przez Vixie cron (1987), przejętego przez wszystkie nowoczesne dystrybucje Linux i macOS. Dziś ta sama składnia występuje w większości schedulerów chmurowych (AWS EventBridge, GCP Cloud Scheduler, Azure Logic Apps) i CI/CD (GitHub Actions, GitLab CI, Jenkins).

┌──── minute (0-59)
│ ┌── heure (0-23)
│ │ ┌── jour du mois (1-31)
│ │ │ ┌── mois (1-12 ou JAN-DEC)
│ │ │ │ ┌── jour de la semaine (0-7 ou SUN-SAT, 0 et 7 = dimanche)
│ │ │ │ │
* * * * *

Dobrze sformowane wyrażenie cron definiuje więc precyzyjny harmonogram cron: każde pole może być stałą wartością, zakresem, listą, krokiem lub gwiazdką, która pasuje do wszystkiego. Zwartość wyrażenia crontab to jego siła, ale to także sprawia, że dekoder cron jest niezbędny do wizualnej weryfikacji intencji. Taki jest cel tego konwertera cron: wyprodukować czytelne wyjaśnienie cron oraz listę kolejnych uruchomień.

Anatomia wyrażenia cron

Pięć pól dzieli wspólną gramatykę. Oto granice akceptowane przez każdą kolumnę standardowego wyrażenia crontab:

  • Minuta: 0-59.
  • Godzina: 0-23, format 24h.
  • Dzień miesiąca: 1-31.
  • Miesiąc: 1-12 lub tekstowe skróty JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC.
  • Dzień tygodnia: 0-7, gdzie 0 i 7 reprezentują niedzielę, lub skróty SUN, MON, TUE, WED, THU, FRI, SAT.

Znaki specjalne wspólne dla pięciu pól:

  • *: any value, pasuje do wszystkich dozwolonych wartości pola.
  • ,: dyskretna lista, na przykład 1,15,30 w polu minuta.
  • -: zakres włączny, na przykład 9-17 dla godzin biurowych.
  • /: krok (step), na przykład */15 = co 15 jednostek, lub 0-30/5 = co 5 minut między 0 a 30.

Rozszerzenia Quartz (Java, AWS EventBridge, Spring): gramatyka rośnie do 6 lub 7 pól z kolumną sekundy na początku (0-59) i czasem kolumną rok na końcu (1970-2099). Quartz wprowadza też ? (no specific value, do oddzielenia dnia-miesiąca i dnia-tygodnia), L (last: ostatni dzień miesiąca lub ostatni piątek z 5L), W (najbliższy dzień roboczy) i # (N-ty dzień tygodnia miesiąca, na przykład 2#3 dla 3. poniedziałku). Wyrażenie Quartz zwykle nie jest kompatybilne z crontab UNIX i odwrotnie: to główne źródło błędów przy kopiowaniu wyrażenia cron między platformami.

# UNIX / Vixie cron (5 champs)
0 9 * * 1-5

# Quartz (6 champs avec secondes)
0 0 9 ? * MON-FRI

# Quartz (7 champs avec année)
0 0 9 ? * MON-FRI 2026

Dlaczego dekodować wyrażenie cron?

Czytanie 0 0 * * * jest szybkie. Czytanie */7 2-5 1,15 * 1-5 jest znacznie mniej. Gdy wyrażenie wychodzi poza trywialne, ryzyko błędu interpretacji rośnie i cron decode staje się pełnoprawnym etapem review.

  • Debug produkcji: zrozumienie, dlaczego zadanie odpaliło o 3:17, a nie o 3:00, lub identyfikacja nakładania się dwóch zadań.
  • Code review: zweryfikowanie, że scheduler zaproponowany w pull request rzeczywiście robi to, co twierdzi autor, bez zapamiętywania semantyki każdego symbolu.
  • Audyt schedulerów: przegląd cron jobs Linux w /etc/crontab i /etc/cron.d/, triggerów Jenkins, spec.schedule w Kubernetes CronJob, reguł AWS EventBridge i zadań GCP Cloud Scheduler.
  • Migracja legacy: przejęcie historycznego /etc/crontab bez dokumentacji i odtworzenie mapy zadań przed zmianą infrastruktury.
  • Onboarding: umożliwienie nowemu programiście odczytania crontab bez konieczności nauki wszystkich znaków specjalnych z dnia na dzień.

Jak korzystać z dekodera cron

Procedura dekodowania wyrażenia crontab za pomocą narzędzia:

  1. Wklej swoje wyrażenie cron w polu wprowadzania (5 pól oddzielonych spacjami).
  2. Wskaż liczbę kolejnych uruchomień do obliczenia.
  3. Kliknij convert, aby uruchomić cron decode: narzędzie zwraca ludzkie zdanie wyjaśniające uruchomienie oraz datowaną listę kolejnych uruchomień.
  4. Wizualnie sprawdź, że daty odpowiadają twojej intencji (godzina, dzień, częstotliwość).
  5. Skopiuj wyjście przyciskiem kopiowania, aby wkleić je do zgłoszenia, PR lub dokumentacji technicznej.

Narzędzie nie zadowala się tylko parsowaniem składniowym: dostarcza wyjaśnienie cron w języku naturalnym, co czyni je jednocześnie dekoderem cron i walidatorem planowania.

Klasyczne przykłady wyrażeń cron

Poniższe wzorce pokrywają większość harmonogramów cron spotykanych w produkcji. Wszystkie są prawidłowe w Linux crontab, Kubernetes CronJob, GitHub Actions i większości schedulerów aplikacyjnych.

Wyrażenie Odczyt ludzki
* * * * * Co minutę
0 * * * * O każdej pełnej godzinie
0 0 * * * Codziennie o północy
0 0 * * 0 W każdą niedzielę o północy
*/15 * * * * Co 15 minut
0 9 * * 1-5 9:00 od poniedziałku do piątku
0 0 1 * * 1. każdego miesiąca o północy
0 0,12 * * * O północy i w południe codziennie
*/5 9-17 * * 1-5 Co 5 minut w godzinach pracy
30 2 1,15 * * 1. i 15. miesiąca o 2:30

Aby uruchomić zadanie cron na serwerze Linux, edytuje się crontab użytkownika z powłoki:

# éditer la crontab de l'utilisateur courant
$ crontab -e

# lister les tâches existantes
$ crontab -l

# exemple de ligne ajoutée : sauvegarde quotidienne à 3h
0 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

Przykład wyjścia konwertera cron dla */5 * * * *:

2026-05-05 00:00:00
2026-05-05 00:05:00
2026-05-05 00:10:00
2026-05-05 00:15:00
2026-05-05 00:20:00
...

Najczęściej zadawane pytania dotyczące dekodera cron

Jaka jest różnica między cron UNIX a Quartz?

UNIX/Vixie cron używa 5 pól (od minuty do dnia tygodnia), bez precyzji do sekundy i nie ma natywnego pojęcia „ostatniego dnia miesiąca". Quartz (Java, Spring, AWS EventBridge) dodaje kolumnę sekundy na początku, czasem kolumnę rok na końcu i kilka symboli (?, L, W, #) nieobecnych w crontab Linux. Wyrażenie cron Quartz z 6 polami nie jest więc bezpośrednio przenośne do /etc/crontab, i odwrotnie. Nasz dekoder cron celuje w format z 5 polami, który pokrywa większość schedulerów.

Jak uruchomić zadanie cron co 5 minut?

Za pomocą kroku / w polu minuta:

*/5 * * * * /usr/local/bin/check-health.sh

To wyrażenie crontab wyzwala skrypt w minutach 0, 5, 10, 15... każdej godziny, każdego dnia. Aby ograniczyć do godzin pracy od poniedziałku do piątku, dodaj ograniczenia na pola godzina i dzień-tygodnia: */5 9-17 * * 1-5.

Co oznacza gwiazdka (*) w wyrażeniu cron?

Gwiazdka oznacza any value: pasuje do wszystkich dozwolonych wartości pola. W 0 0 * * * trzy gwiazdki oznaczają „dowolny dzień miesiąca, dowolny miesiąc, dowolny dzień tygodnia". W połączeniu z dwoma pierwszymi polami ustawionymi na 0 otrzymujemy „codziennie o północy". Gwiazdka może też być łączona z krokiem: */15 w minutach = co 15 minut.

Czy crontab ma strefę czasową?

Domyślnie strefę serwera. W crontab Linux to systemowe TZ (często UTC na VPS i w kontenerach). GitHub Actions wymusza UTC. Kubernetes CronJob używa strefy kontrolera, konfigurowalnej przez spec.timeZone od 1.27. AWS EventBridge ocenia wyrażenia w UTC. Aplikacyjne scheduler (Symfony Scheduler, Quartz, Airflow) często pozwalają ustawić dedykowaną strefę dla każdego zadania. W razie wątpliwości sprawdź date na serwerze docelowym i porównaj z wyjściem konwertera cron.

Cron job vs polecenie at: który wybrać?

cron służy do wykonywania zadania rekurencyjnego według harmonogramu. at służy do wykonania polecenia jednorazowo w danym momencie. Do codziennej kopii zapasowej, rotacji logów lub regularnego wywołania API użyj cron. Aby odroczyć jednorazową operację („uruchom ponownie wdrożenie dziś wieczorem o 22"), użyj at:

$ echo "/usr/local/bin/deploy.sh" | at 22:00
Jak przetestować wyrażenie cron bez jego wyzwalania?

To dokładnie rola tego konwertera cron: oblicza N kolejnych uruchomień od bieżącej chwili, bez uruchamiania żadnego zadania. Natychmiast widzisz, czy twoje wyrażenie crontab odpala o 3:00 zgodnie z planem, czy o 3:17 przypadkowo. Aby pójść dalej przed instalacją zadania, możesz też przetestować sam skrypt (bash -x script.sh) i zweryfikować składnię pliku crontab za pomocą crontab -T fichier w dystrybucjach, które to obsługują.

Co się dzieje, gdy dzień-miesiąca i dzień-tygodnia są oba ustawione?

W Vixie cron (Linux) regułą jest logiczne LUB: zadanie odpala, jeśli jedno z dwóch pól pasuje. Jest to sprzeczne z intuicją i źródłem błędów. Quartz używa I, stąd wprowadzenie symbolu ? do jawnego sygnalizowania „brak ograniczenia". Zazwyczaj ustawiaj tylko jedno z dwóch pól.

Przykładowe zapytanie

curl -X POST https://cdrn.fr/api/v1/tools/cron-converter/execute \
  -H "Content-Type: application/json" \
  -d '{"cron":"...","number_next_date":1}'

Schemat wejściowy

Pole Typ Wymagane Domyślnie
cron string
number_next_date integer

Punkty końcowe

  • GET https://cdrn.fr/api/v1/tools - lista wszystkich dostępnych narzędzi
  • GET https://cdrn.fr/api/v1/tools/cron-converter - zwraca schemat dla tego narzędzia
  • POST https://cdrn.fr/api/v1/tools/cron-converter/execute - uruchamia to narzędzie z payloadem JSON