Zbuduj wyrażenie cron z prostych opcji – bez zapamiętywania składni.
Wyrażenie cron
0 2 * * *Codziennie — 02:00
Pięć pól wyrażenia cron
Wyrażenie cron składa się z pięciu pól w stałej kolejności: minuta, godzina, dzień miesiąca, miesiąc i dzień tygodnia. Gwiazdka oznacza „każdą wartość", liczba wskazuje konkretną wartość, a */N oznacza „co N". Zatem 30 2 * * 1 uruchamia się o 02:30 w każdy poniedziałek.
Dwie rzeczy bywają zaskoczeniem. W dniu tygodnia niedziela to 0 (a w większości implementacji także 7), więc poniedziałek to 1. Jeśli ustawisz jednocześnie dzień miesiąca i dzień tygodnia, większość demonów cron uruchomi zadanie, gdy pasuje którykolwiek z nich, a nie oba – więc zostaw jedno z pól jako gwiazdkę, chyba że naprawdę chcesz takiego działania.
Dlaczego `0 0 13 * 5` nie oznacza piątku trzynastego
Wyrażenie cron to pięć pól opisujących, kiedy uruchamia się polecenie. Większość jest oczywista, gdy raz się ją zobaczy. Dwie rzeczy nie są: jak łączą się pola dni i przez co tak naprawdę przeskakuje wartość kroku. Obie po cichu tworzą harmonogramy odpalające się znacznie częściej, niż zamierzano.
Jak to działa
- Buduje pięciopolowe wyrażenie — minuta, godzina, dzień miesiąca, miesiąc, dzień tygodnia — ze zwykłych wyborów.
- Pokazuje najbliższe czasy uruchomienia, co jest jedynym pewnym sposobem potwierdzenia, że wyrażenie znaczy to, co myślisz.
- Uwidacznia interakcję dnia miesiąca i dnia tygodnia, zamiast zostawiać ją do odkrycia na produkcji.
┌─ minuta 0–59 │ ┌─ godzina 0–23 │ │ ┌─ dzień miesiąca 1–31 │ │ │ ┌─ miesiąc 1–12 │ │ │ │ ┌─ dzień tygodnia 0–6 (niedziela = 0) * * * * * jeśli dzień miesiąca I dzień tygodnia są oba ograniczone, cron uruchamia przy KTÓREJKOLWIEK zgodności
Przykład z liczbami
Dwa wyrażenia, które niemal każdy odczytuje za pierwszym razem źle.
- `0 0 13 * 5` czyta się jak "północ w piątek trzynastego"
- oba pola dni są ograniczone, więc cron łączy je alternatywą
- w rzeczywistości uruchamia się trzynastego każdego miesiąca I w każdy piątek — około 64 razy w roku, a nie raz czy dwa
- `0 0 */7 * *` czyta się jak "co siedem dni"
- krok działa w zakresie 1–31, dając 1., 8., 15., 22. i 29.
Drugie wyrażenie resetuje się co miesiąc, więc odstęp od 29. do następnego 1. to trzy dni w miesiącu 31-dniowym, a nie siedem. Żadne z nich nie jest tygodniowe. `0 0 * * 5` to sposób na każdy piątek.
Jak czytać wynik
- Reguła alternatywy działa tylko wtedy, gdy oba pola dni są ograniczone. Jeśli którekolwiek jest `*`, drugie zachowuje się normalnie — dlatego pułapka pozostaje ukryta, dopóki ktoś nie wypełni obu.
- Kroki zawsze liczą się od początku zakresu, a nie od dzisiaj. `*/7` w polu zaczynającym się od 1 trafia na 1, 8, 15, 22, 29 niezależnie od dnia wdrożenia.
- Cron używa strefy czasowej systemu lub demona. Zadanie ustawione na 02:30 może uruchomić się dwa razy albo wcale w dniach zmiany czasu; planowanie poza 01:00–03:00 usuwa ten problem całkowicie.
- `0` i `7` oznaczają niedzielę w polu dnia tygodnia w większości implementacji, a nazwy jak `MON` czy `JAN` są szeroko, lecz nie powszechnie obsługiwane.
Częste pytania
- Jak naprawdę zaplanować coś co siedem dni?
- Użyj dnia tygodnia: `0 0 * * 5` dla każdego piątku. Jeśli naprawdę potrzebujesz stałego odstępu siedmiu dni niezależnego od kalendarza, cron jest złym narzędziem — zadanie przeplanowujące samo siebie albo timer z odstępem monotonicznym wyraża to poprawnie.
- Co uruchamia się 31. w krótkim miesiącu?
- Nic. Cron nie przenosi na 1., więc `0 0 31 * *` po cichu pomija luty, kwiecień, czerwiec, wrzesień i listopad. Do zadań końcamiesięcznych zaplanuj 1. i patrz wstecz.