Parser wyrażeń Cron

Wyrażenia cron definiują harmonogramy powtarzających się zadań w systemach uniksowych. To narzędzie parsuje składnię cron (5-7 pól), wyjaśnia każde pole prostym językiem, oblicza następne zaplanowane czasy uruchomienia i ostrzega o typowych błędach. Obsługuje zarówno format crontab użytkownika, jak i systemowy format crontab z polami użytkownika i polecenia.

Specyfikacje

Typowe zastosowania

  • Debugowanie, dlaczego zadanie cron nie uruchamia się w oczekiwanych czasach
  • Zrozumienie odziedziczonych wyrażeń cron w konfiguracji
  • Planowanie harmonogramów kopii zapasowych i konserwacji
  • Weryfikacja harmonogramów potoku CI/CD (GitHub Actions, GitLab CI)
  • Testowanie harmonogramów Kubernetes CronJob przed wdrożeniem
  • Analiza wpisów systemowego crontab z /etc/crontab lub /etc/cron.d/

Funkcje

  • Parsowanie wyrażeń cron 5-polowych (standardowe), 6-polowych (z sekundami) i 7-polowych (z sekundami i rokiem)
  • Obsługa systemowego formatu crontab z polem użytkownika (np. "0 5 * * * root /path/to/script")
  • Wyodrębnianie i wyświetlanie polecenia z linii cron
  • Wyjaśnianie każdego pola w języku zrozumiałym dla człowieka
  • Obliczanie następnych 10 zaplanowanych czasów wykonania
  • Obsługa zakresów (1-5), list (1,3,5), kroków (*/15) i nazw (MON, JAN)
  • Ostrzeganie o typowych problemach, takich jak określenie dnia 31 w harmonogramie

Przyklady

Każdego dnia roboczego o 9:00

Wypróbuj →

Uruchamia się o 9:00 od poniedziałku do piątku.

0 9 * * 1-5

Co 15 minut

Wypróbuj →

Uruchamia się w minutach 0, 15, 30 i 45 każdej godziny.

*/15 * * * *

Systemowy crontab z użytkownikiem i poleceniem

Wypróbuj →

Codzienna kopia zapasowa o 5:00 uruchamiana jako użytkownik root (format systemowego crontab z /etc/crontab).

0 5 * * * root /usr/bin/backup.sh

Cron z poleceniem (crontab użytkownika)

Wypróbuj →

Kontrola stanu co 5 minut (format crontab użytkownika).

*/5 * * * * curl -s http://localhost/health

Raz w miesiącu, pierwszego dnia

Wypróbuj →

Uruchamia się o północy pierwszego dnia każdego miesiąca.

0 0 1 * *

Wskazowki

  • Pięć pól to: minuta (0-59), godzina (0-23), dzień miesiąca (1-31), miesiąc (1-12), dzień tygodnia (0-6, Niedziela=0).
  • Systemowy crontab (/etc/crontab, /etc/cron.d/*) ma 6. pole dla nazwy użytkownika przed poleceniem.
  • Crontaby użytkownika (crontab -e) nie mają pola nazwy użytkownika; uruchamiają się jako właściciel crontaba.
  • Użyj * dla "każdy" i */n dla "co n-ty".
  • Nazwy dni (SUN-SAT) i nazwy miesięcy (JAN-DEC) nie rozróżniają wielkości liter.
  • Bądź ostrożny, używając jednocześnie dnia miesiąca i dnia tygodnia; zachowanie różni się między implementacjami.

Zrozumienie Parser wyrażeń Cron

Cron to oparty na czasie planista zadań w systemach operacyjnych uniksowych, a wyrażenia cron to zwięzła składnia definiująca, kiedy zadanie ma być uruchomione. Standardowy format pięciopolowy określa minutę (0-59), godzinę (0-23), dzień miesiąca (1-31), miesiąc (1-12) i dzień tygodnia (0-6, gdzie 0 to niedziela). Gwiazdka (*) pasuje do wszystkich wartości, więc "* * * * *" uruchamia się co minutę.

Poza prostymi wartościami, cron obsługuje kilka operatorów. Zakresy (1-5) pasują do ciągłego przedziału. Listy (1,3,5) pasują do dyskretnych wartości. Wartości krokowe (*/15) tworzą regularne interwały. Można je łączyć: 1-5/2 w polu dnia tygodnia oznacza poniedziałek, środę, piątek. Pola miesiąca i dnia tygodnia akceptują trzyliterowe nazwy (JAN-DEC, SUN-SAT).

Implementacje cron różnią się. Crontaby użytkownika mają pięć pól plus polecenie. Systemowe crontaby dodają pole nazwy użytkownika. Niektóre implementacje obsługują szóste pole dla sekund (Spring, Quartz, Kubernetes) i siódme dla roku. AWS EventBridge, GitHub Actions i inne harmonogramy chmurowe mają własne warianty.

Typowe pułapki obejmują interakcję między polami dnia miesiąca i dnia tygodnia: jeśli oba są określone (nie *), zadanie uruchamia się, gdy którykolwiek warunek jest spełniony (logika OR). Obsługa stref czasowych to kolejny problem — zadania cron uruchamiają się w strefie czasowej systemu, chyba że ustawiono CRON_TZ, a przejścia czasu letniego mogą powodować pomijanie lub podwójne uruchamianie zadań.

Operator / tworzy wartości krokowe. */5 w polu minut oznacza "co 5. minutę" i daje uruchomienia w minutach 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50 i 55 każdej godziny. Zakresy można łączyć z krokami: 10-30/5 oznacza co 5 minut między minutą 10 a 30. Aby uruchomić zadanie o określonej godzinie w określone dni, ustaw pola minuty i godziny na żądany czas, a pole dnia tygodnia na docelowe dni. Na przykład "30 14 * * 1-5" uruchamia się o 14:30 od poniedziałku do piątku, a "0 9 * * 0" uruchamia się o 9:00 każdej niedzieli. Wszystkie czasy są interpretowane w lokalnej strefie czasowej serwera, chyba że CRON_TZ jest jawnie skonfigurowane.

Cron używa czasu zegarowego, co oznacza, że przejścia czasu letniego mogą powodować nieoczekiwane zachowanie. Gdy zegary przesuwają się do przodu, zadania zaplanowane między 2:00 a 2:59 mogą zostać całkowicie pominięte. Gdy zegary cofają się, zadania w tym oknie mogą uruchomić się dwukrotnie. Dla krytycznych zadań ustawienie CRON_TZ=UTC eliminuje te problemy. Alternatywnie można unikać planowania zadań w oknie przejścia lub projektować zadania jako idempotentne, aby podwójne uruchomienia były nieszkodliwe.

Składnia cron została zaadaptowana daleko poza systemy Unix. Kubernetes CronJobs, GitHub Actions, GitLab CI, AWS EventBridge, Google Cloud Scheduler, Spring @Scheduled i wiele bibliotek kolejek zadań używa wyrażeń cron do planowania. Jednak każda implementacja może obsługiwać różne funkcje — niektóre dodają pole sekund, niektóre pole roku, a niektóre używają ? do oznaczenia "brak określonej wartości" w polach dnia miesiąca lub dnia tygodnia.

← Powrot do wszystkich narzedzi