Dlaczego moja praca Crona działała w tym miesiącu?


31

Dzisiaj jest 1 listopada 2016 r. Lub cyframi (jednoznacznymi), 01.11.2016.

Mam skonfigurowane zadanie CRON użytkownika:

# m h  dom mon dow   command
33  3   1  */2  *    /home/user/...

Powinien być uruchamiany co drugi miesiąc pierwszego miesiąca o godzinie 3:33, bez względu na to, jaki jest dzień tygodnia, ale z jakiegoś powodu został uruchomiony dzisiaj, mimo że 11 nie jest podzielne przez 2.

Czy ktoś może mi to wyjaśnić? Czy moje założenie podzielności przez 2 jest błędne?

EDYCJA: Zapomniałem wspomnieć, że używam cronwersji „3.0pl1-127 + deb8u1” na maszynie Debiana 8.6 „Jessie”.



Mówisz więc o 11 dniu 2016 roku 1 roku. :) (Najpopularniejsza kolejność dat w Ameryce to miesiąc-dzień-rok.)
pisklęta

@ kurczaki sprawdzają historię edycji tego pytania, pierwotnie użyłem formatu, o którym wspomniałeś ;-)
comfreak

@ kurczaki masz na myśli miesiąc / dzień / rok?
user253751

@immibis No. ... comfreak: lol
pisklęta

Odpowiedzi:


61

Nie /jest wyrażeniem arytmetycznym, lecz opisuje „wartości kroku” w dozwolonym zakresie wartości. Zatem, ponieważ miesiące zawsze zaczynają się 1od 0, /2oznaczałoby „bierz co drugą wartość”, co powoduje (1, 3, 5, 7, 9, 11).

Jest to również opisane na stronie podręcznika, chociaż nie jest to strasznie jasne i łatwe do zrozumienia:

Wartości stopni można stosować w połączeniu z zakresami. Następowanie zakresu za pomocą „<numer>” określa pomijanie wartości liczby przez zakres. Na przykład „0-23 / 2” może być użyte w polu godzin do określania wykonania polecenia co drugą godzinę (alternatywą w standardzie V7 jest „0,2,4,6,8,10,10,12,14,16 , 18,20,22 ”). Kroki są również dozwolone po gwiazdce, więc jeśli chcesz powiedzieć „co dwie godziny”, po prostu użyj „* / 2”.


2
Dzięki za odpowiedź, właśnie sobie to uświadomiłem po ponownym przeczytaniu strony podręcznika i przejrzeniu tego w mojej głowie. Zwykle pracowałem tylko z krótkoterminowymi zadaniami cron, gdzie liczby zaczynają się od 0, a moje założenie faktycznie miało sens.
comfreak

18
Właśnie zastanawiałem się, dlaczego nie zadaje się tego pytania częściej, i doszedłem do tego samego wniosku: ponieważ niewiele osób prowadzi pracę z czymkolwiek, co nie oznacza „*” w polu miesiąca.
Sven

Jedno pytanie, co by się stało, gdyby liczba się nie dzieliła, np. */5? Czy byłoby to 1,6,11,1,6 ... czy byłoby 1,6,11,4,9 ...? Założyłem, że „powyżej dozwolonego zakresu wartości” oznacza, że ​​nie ma pamięci, ale teraz nie byłem tego taki pewien.
MariusSiuram

@MariusSiuram: pierwszy wariant. Ponownie, nie jest to operacja arytmetyczna. crondpo prostu bierze listę możliwych wartości, stosuje selektor kroków jeden raz, a następnie używa tych wyników wielokrotnie.
Sven

4

Dzisiaj jest pierwszy dzień listopada.

* / 2 oznacza, że ​​twoja praca z cronjob będzie wykonywana co drugi miesiąc, jak mówisz.

Tak więc w przyszłym miesiącu (grudniu) cronjob nie zostanie wykonany, ale nastąpi miesiąc (styczeń) po nim.

Miesiąc przed tym miesiącem (październik) cronjob nie został wykonany. Ale we wrześniu tak było.


1
Uważasz więc, że */2pole miesiąca odpowiada 1-11/2, a nie 2-12/2. Nie twierdzę, że się mylisz, ale czy możesz przedstawić dokumentację potwierdzającą?
MadHatter obsługuje Monikę

@MadHatter Sven dobrze to wytłumaczył.
Sieroty

1
Zgadzam się, a co najważniejsze, zacytował wiarygodne źródła.
MadHatter obsługuje Monikę

2
Tylko wskazując, wrzesień poprzedza październik, a nie sierpień ;-)
hjpotter92
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.