Przejdź do treści

Składnia wyrażeń cron

Wyrażenie cron to pięć pól opisujących kiedy coś powinno się uruchomić. Każde pole mówi które wartości jego jednostki są dopuszczalne, i zadanie uruchamia się każdej minuty gdzie wszystkie pięć się zgadza. To cały model: nie ma pojęcia czasu trwania, nie ma "każde 90 minut", i nigdzie nie są przechowywane stan następnego uruchomienia.

Pola czyta się od lewej do prawej jako minuta, godzina, dzień miesiąca, miesiąc, dzień tygodnia. Przykłady na dole to te po które ludzie faktycznie sięgają, i każdy z nich przechodzi parser cron tej strony przed budowaniem tej strony.

Ostatnia sekcja wymienia składnię która wygląda jak cron ale tu się nie przyjmuje: rozszerzenia Quartza i Jenkinsa, i forma sześciopola z sekundami. Warto je znać bo skopiowane wyrażenie które jedno z nich używa po prostu zawali się.

Pięć pól

7

Wiersz cron to pięć pól oddzielonych spacjami, potem polecenie. Każde pole musi być obecne; nie ma sposobu aby pominąć jedno.

WyrażenieZakresZnaczenie
* * * * *min hod dom mes dowPięć pól w porządku: minuta, godzina, dzień miesiąca, miesiąc, dzień tygodniaPięć gwiazdek oznacza każdą minutę każdego dnia — najluźniejsze możliwe wyrażenie.
minute0-59Pierwsze pole
hour0-23Drugie pole, na zegarze 24-godzinnym
day of month1-31Trzecie poleDzień który nie istnieje w danym miesiącu jest po prostu pomijany — 31 uruchamia się siedem razy do roku, nie dwanaście.
month1-12Czwarte pole
day of week0-7Piąte pole, niedziela na pierwszymZarówno 0 jak i 7 oznaczają niedzielę, dlatego zakres idzie do siedmiu nie do sześciu.
0 5 13 * 5Gdy oba pola dnia są ograniczone, cron uruchamia się w każdy z nich — nie w obydwa narazTo uruchamia się 13 i każdy piątek, więc to nie jest "piątek trzynasty". To jedyne prawidło crona które wszystkich zaskakuje.

Operatory

10

Te same cztery operatory pracują w każdym polu; zmienia się tylko zakres liczb które przyjmują.

WyrażenieZakresZnaczenie
*Każda wartość którą pole pozwala
1,15,30Lista poszczególnych wartości
9-17Zakres włącznie z obydwoma końcami
*/15Każda n-ta wartość w całym polu*/15 w polu minut oznacza :00, :15, :30 i :45 — liczy od dna zakresu, nie od teraz.
9-17/2Każda n-ta wartość w zakresu
5/10Każda n-ta wartość od punktu startowego do końca pola
0,30 9-17 * * 1-5Operatory kombinują się swobodnie w każdym poluW pół godziny po godzinie, między dziewiątą a piątą, poniedziałek do piątku.
JAN-DEC1-12Nazwy miesięcy, trzy litery, bez względu na wielkość
SUN-SAT0-6Nazwy dni, trzy litery, bez względu na wielkość
70Niedziela, napisana drugim sposobem

Skrótowe makra

7

Siedem nazw które zastępują całe wyrażenie. To wygoda formatu crontab niż gramatyka pól, więc harmonogram który czyta stringi cron wcale ich nie musi przyjmować.

WyrażenieZakresZnaczenie
@hourly0 * * * *Na początku każdej godziny
@daily0 0 * * *Raz dziennie o północy
@midnight0 0 * * *To samo co @daily
@weekly0 0 * * 0Raz w tygodniu, niedziela o północy
@monthly0 0 1 * *Pierwszego dnia miesiąca o północy
@yearly0 0 1 1 *Pierwszego stycznia o północy
@annually0 0 1 1 *To samo co @yearly

Gotowe przykłady

14

Czytaj je od prawej do lewej gdy przestają mieć sens: najgrubsze pole jest po prawej i decyduje który dni nawet są oceniane pola drobniejsze.

WyrażenieZakresZnaczenie
* * * * *Każdą minutę
*/5 * * * *Każde pięć minut
0 * * * *Każdą godzinę, zawsze o jej starcie
0,30 * * * *Każde pół godziny
0 3 * * *Każdego dnia o 03:00
0 9,17 * * *Dwa razy dziennie, o 09:00 i 17:00
*/15 9-17 * * 1-5Każde piętnaście minut podczas godzin pracy w dni robocze
0 8 * * 1-5Dni robocze o 08:00
0 10 * * 6,0Sobota i niedziela o 10:00
30 7 * * MONPoniedziałek o 07:30
0 0 1 * *O północy pierwszego każdego miesiąca
0 0 28-31 * *Każdego dnia w ostatniej części miesiącaStandardowy cron nie zna "ostatniego dnia miesiąca". To uruchamia się aż cztery razy; zwyczajne rozwiązanie to skrypt który sprawdza datę i natychmiast kończy.
0 0 1 1,4,7,10 *O północy pierwszego dnia każdego kwartału
0 0 1 1 *Raz w roku, na starcie 1 stycznia

Rozszerzenia których ta strona nie przyjmuje

6

Dodają je Quartz, Jenkins i niektóre harmonogramy chmury. Są wymienione żeby je rozpoznać w cudzym crontabie — parser tu każde z nich odrzuca, tak jak cron wysyłany z Linuxem.

WyrażenieZakresZnaczenie
?"Żadna konkretna wartość" w polu dnia które inne już ogranicza
LOstatni dzień miesiąca albo ostatni dany dzień tygodnia
15WDzień roboczy najbliższy 15
FRI#3Trzeci piątek miesiąca
*/30 * * * * *Szóste pole dla sekund, na przodzieSześć pól, nie pięć. Quartz i kilka bibliotek tego używa; plik crontab nie.
@rebootUruchom raz gdy maszyna się startujeRzeczywiste w crontabie ale to nie harmonogram — nie ma następnego uruchomienia do obliczenia, dlatego parser tu to odrzuca.

Częste pytania

Dlaczego moje zadanie na "piątek trzynasty" uruchamiało się każdy piątek?
Bo gdy oba pola dnia są ograniczone — dzień miesiąca i dzień tygodnia — cron traktuje je jako lub nie i. 0 5 13 * 5 uruchamia się 13 i każdy piątek. Prawdziwy piątek trzynasty wymaga sprawdzenia daty w samym skrypcie.
Czy */5 oznacza "za pięć minut od teraz"?
Nie. Kroki liczą się od dna zakresu pola, nie od momenty instalacji zadania, więc */5 w polu minut oznacza :00, :05, :10 i tak dalej — niezależnie od tego kiedy wyrażenie napisano.
Jaką strefę czasową używa cron?
Systemową, chyba że crontab na górze ustawi CRON_TZ albo TZ. Dwakrotnie do roku ma to znaczenie: zadanie zaplanowane w godzinie którą zmiana na czas letni pomija się nie uruchamia, a zadanie w godzinie która się powtarza może uruchomić się dwa razy.
Czy 0 to to samo co 7 w polu dnia tygodnia?
Tak, obydwa to niedziela. Duplikat istnieje żeby zakres 1-7 obejmujący poniedziałek przez niedzielę mógł być napisany naturalnie, czego pole 0-6 nie może wyrazić w jednym zakresie.
Gdzie mogę przetestować wyrażenie?
Parser cron na tej stronie przyjmuje wyrażenie i pokazuje następne uruchomienia zwykłym językiem, lokalnie w przeglądarce. Narzędzie obok idzie drugą stroną: wybierz rozkład a ono naprawdę napisze wyrażenie.