Skip to main content

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.

  1. `0 0 13 * 5` czyta się jak "północ w piątek trzynastego"
  2. oba pola dni są ograniczone, więc cron łączy je alternatywą
  3. 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
  4. `0 0 */7 * *` czyta się jak "co siedem dni"
  5. 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.