Wyrażenia cron bez tajemnic: zaplanuj cokolwiek
Musisz uruchamiać kopię zapasową bazy danych co noc o 3:00. Albo wysyłać raport w każdy poniedziałek rano. Albo czyścić cache co 15 minut. Na serwerach Linux i Unix narzędziem do tego jest cron, a sposób, w jaki mówisz cronowi, kiedy coś uruchomić, to wyrażenie cron.
Wyrażenia cron na pierwszy rzut oka wyglądają onieśmielająco. 0 3 * * * lub */15 9-17 * * 1-5 mogą wydawać się bełkotem, jeśli nie znasz wzorca. Ale składnia jest zaskakująco prosta, gdy zrozumiesz pięć pól.
Pięć pól
Każde standardowe wyrażenie cron ma dokładnie pięć pól oddzielonych spacjami. Każde pole reprezentuje jednostkę czasu:
┌───────────── minuta (0-59)
│ ┌───────────── godzina (0-23)
│ │ ┌───────────── dzień miesiąca (1-31)
│ │ │ ┌───────────── miesiąc (1-12)
│ │ │ │ ┌───────────── dzień tygodnia (0-7, gdzie 0 i 7 to niedziela)
│ │ │ │ │
* * * * *
To wszystko. Pięć pól, od lewej do prawej: minuta, godzina, dzień miesiąca, miesiąc, dzień tygodnia.
Czy wiesz, że? Nazwa „cron" pochodzi od greckiego słowa „chronos" oznaczającego czas. Demon cron (proces w tle) jest podstawową częścią systemów operacyjnych typu Unix od 1975 roku.
Znaki specjalne
Gwiazdka (*) — każda wartość
Gwiazdka oznacza „każdą możliwą wartość" dla danego pola.
* * * * * = co minutę, o każdej godzinie, każdego dnia.
Przecinek (,) — wiele wartości
Przecinek rozdziela poszczególne wartości.
0 9,12,18 * * * = o minucie 0 godzin 9, 12 i 18 (9:00, 12:00, 18:00).
Myślnik (-) — zakres wartości
Myślnik definiuje zakres.
0 9-17 * * * = o minucie 0 każdej godziny od 9 do 17 (9:00 do 17:00, co godzinę).
Ukośnik (/) — wartości kroków
Ukośnik definiuje interwały.
*/15 * * * * = co 15 minut (minuta 0, 15, 30, 45 każdej godziny).
0 */2 * * * = co 2 godziny o minucie 0 (północ, 2:00, 4:00, ...).
Czytanie wyrażeń cron: ćwiczenia
Przejdźmy przez typowe przykłady. Dla każdego czytaj pięć pól od lewej do prawej.
0 3 * * * — codziennie o 3:00
| Pole | Wartość | Znaczenie |
|---|---|---|
| Minuta | 0 | O minucie 0 |
| Godzina | 3 | Godziny 3 (3:00) |
| Dzień miesiąca | * | Każdego dnia |
| Miesiąc | * | Każdego miesiąca |
| Dzień tygodnia | * | Każdego dnia tygodnia |
Tłumaczenie: „O 3:00 każdego dnia." Klasyczny wybór do nocnych kopii zapasowych.
*/15 * * * * — co 15 minut
| Pole | Wartość | Znaczenie |
|---|---|---|
| Minuta | */15 | Co 15 minut |
| Godzina | * | Każdej godziny |
| Dzień miesiąca | * | Każdego dnia |
| Miesiąc | * | Każdego miesiąca |
| Dzień tygodnia | * | Każdego dnia |
Tłumaczenie: „Co 15 minut, całą dobę." Częste zastosowanie przy sprawdzaniu stanu i odświeżaniu cache.
0 9 * * 1-5 — dni robocze o 9:00
| Pole | Wartość | Znaczenie |
|---|---|---|
| Minuta | 0 | O minucie 0 |
| Godzina | 9 | Godziny 9 |
| Dzień miesiąca | * | Każdego dnia |
| Miesiąc | * | Każdego miesiąca |
| Dzień tygodnia | 1-5 | Od poniedziałku do piątku |
Tłumaczenie: „O 9:00, od poniedziałku do piątku." Idealne do codziennych raportów roboczych.
0 0 1 * * — pierwszy dzień każdego miesiąca
| Pole | Wartość | Znaczenie |
|---|---|---|
| Minuta | 0 | O minucie 0 |
| Godzina | 0 | Godziny 0 (północ) |
| Dzień miesiąca | 1 | Pierwszego |
| Miesiąc | * | Każdego miesiąca |
| Dzień tygodnia | * | Dowolnego dnia tygodnia |
Tłumaczenie: „O północy pierwszego dnia każdego miesiąca." Używane do raportów miesięcznych, rozliczeń lub porządków.
30 8 * * 1 — poniedziałki o 8:30
| Pole | Wartość | Znaczenie |
|---|---|---|
| Minuta | 30 | O minucie 30 |
| Godzina | 8 | Godziny 8 |
| Dzień miesiąca | * | Każdego dnia |
| Miesiąc | * | Każdego miesiąca |
| Dzień tygodnia | 1 | Poniedziałek |
Tłumaczenie: „O 8:30 w każdy poniedziałek." Świetne do cotygodniowych powiadomień zespołowych.
Pisanie własnych wyrażeń cron
Oto systematyczne podejście:
- Zacznij od kiedy. „Codziennie o 3:00" lub „co 5 minut w godzinach pracy."
- Wypełnij pola od lewej do prawej. Zacznij od minuty, potem godzina, dzień miesiąca, miesiąc, dzień tygodnia.
- Użyj
*dla „każdy". Jeśli nie zależy Ci na danym polu, użyj*. - Testuj przed wdrożeniem. Zawsze sprawdź, czy wyrażenie daje oczekiwany harmonogram.
Szybka ściągawka typowych wzorców
| Harmonogram | Wyrażenie |
|---|---|
| Co minutę | * * * * * |
| Co 5 minut | */5 * * * * |
| Co godzinę | 0 * * * * |
| Codziennie o północy | 0 0 * * * |
| Codziennie o 3:00 | 0 3 * * * |
| Każdy poniedziałek o 9:00 | 0 9 * * 1 |
| Dni robocze o 8:30 | 30 8 * * 1-5 |
| Pierwszy dzień miesiąca | 0 0 1 * * |
| Co 15 min w godzinach pracy | */15 9-17 * * 1-5 |
| Dwa razy dziennie (9:00 i 18:00) | 0 9,18 * * * |
| Każdą niedzielę o 2:00 | 0 2 * * 0 |
Częste błędy
Zapominanie, że godziny to 0-23
Godzina 13 to 13:00, nie godzina 1. Częstym błędem jest pisanie 0 1 * * * w przekonaniu, że uruchomi się o 13:00, gdy faktycznie uruchomi się o 1:00 w nocy.
Zamieszanie z dniem tygodnia
Niedziela może być 0 lub 7 (oba są poprawne). Poniedziałek to 1, sobota to 6. Niektórzy oczekują, że poniedziałek to 0.
Interakcja dzień miesiąca vs. dzień tygodnia
Jeśli określisz zarówno dzień miesiąca, jak i dzień tygodnia (żaden nie jest *), większość implementacji crona uruchomi zadanie, gdy którykolwiek warunek jest spełniony, a nie gdy oba. To zaskakuje wiele osób.
Uwaga Wyrażenie 0 9 15 * 1 NIE oznacza „o 9:00 15-ego, ale tylko jeśli wypada w poniedziałek." Oznacza „o 9:00 15-ego każdego miesiąca ORAZ o 9:00 w każdy poniedziałek." To częste źródło nieoczekiwanego zachowania.
Świadomość strefy czasowej
Cron działa w lokalnej strefie czasowej serwera. Jeśli Twój serwer jest w UTC, a Ty jesteś w Polsce (UTC+1/+2), zadanie cron 0 9 * * * uruchomi się o 10:00 lub 11:00 czasu polskiego. Zawsze sprawdzaj strefę czasową serwera.
Wskazówka Testuj i wizualizuj wyrażenia cron przed wdrożeniem: Jak czytać i testować wyrażenia cron. Zobacz następne czasy uruchomienia i potwierdź, że harmonogram odpowiada Twoim intencjom.
Twórz i testuj wyrażenia cron:
Darmowe, natychmiastowe i bez rejestracji.