Czy wiele wpisów @daily crontab jest przetwarzanych kolejno, szeregowo?

22

Chcę, aby dwa zadania były uruchamiane codziennie, szeregowo, dokładnie w określonej przeze mnie kolejności. Czy ten crontab niezawodnie zrobi to, co chcę?

@daily job1
@daily job2

Zakładam, że oni uruchomić jeden po drugim, ale nie udało mi się znaleźć odpowiedzi, szukając w internecie lub z jednego z tych stron podręcznika: cron(1), crontab(1), crontab(5).

Powyższy crontab oczywiście nie zrobi tego, co chcę, jeśli cron uruchomi rzeczy zaplanowane @dailyrównolegle lub w nieprzewidywalnej kolejności.

Wiem, że mogę po prostu wykonać jeden skrypt powłoki, aby je odpalić, po prostu jestem ciekawy, jak powinien działać cron (i jestem zbyt leniwy, aby zbierać dane testowe lub czytać kod źródłowy).

Cron jest dostarczany przez cronpakiet. System operacyjny to Ubuntu 10.04 LTS (serwer).

Adam Monsen
źródło
Czy zdarza ci się wiedzieć, który cron jest dostarczany przez cronpaczkę? Prawie wszystkie demony cron, które znam, obsłużą to w kolejności i synchronicznie, zwykle najpierw parsują każdy plik w kolejności alfabetycznej (chociaż niektóre robią to według czasu między kolejnymi uruchomieniami w kolejności rosnącej), a następnie zadań wewnątrz w kolejności liniowej.
Chris Down,
5
Fakt, że nie jest on określony, zwykle oznacza, że ​​należy do implementacji i zazwyczaj najlepiej nie polegać na takim zachowaniu. Prawdopodobnie jest bardziej przejrzysty i lepiej zorganizowany, aby umieścić sekwencję zadań, w których sekwencja ma znaczenie we własnym skrypcie, a nie jako osobne wpisy crontab.
jw013,
@ChrisDown: Myślę, że Vixie Cron. packages.ubuntu.com/lucid/cron
Adam Monsen,
1
Sugerowałbym, jeśli naprawdę chcesz je uruchomić po kolei, wykonaj jedną minutę później.
Kevin,
@ jw013 i Kevin: zgodzili się, ale to nie moje pytanie.
Adam Monsen,

Odpowiedzi:

26

Po szybkim spojrzeniu na źródło (w ściśnięciu Debiana, który moim zdaniem jest tą samą wersją), wygląda to tak, jakby wpisy w danym pliku i z tymi samymi czasami były wykonywane w kolejności. W tym celu, @dailyi 0 0 * * *są identyczne (w rzeczywistości @dailyjest identyczna z 0 0 * * *tą cron).

Nie polegałbym na tym na całej planszy. Możliwe, że pewnego dnia ktoś zdecyduje, że cron powinien uruchamiać zadania równolegle, aby skorzystać z tych 32-rdzeniowych procesorów, które mają 31 rdzeni bezczynnych. Można to zrobić podczas implementacji tego 20-letniego elementu todo napotkanego w źródle cron:

Wszystkie powinny być oflagowane i ograniczone do obciążenia; tzn. zamiast @hourly oznaczającego „0 * * * *” powinno oznaczać „blisko każdej godziny, ale nie„ dopóki obciążenie systemu nie będzie niskie ”. (…) (Vix, jan90)

Tutaj bardzo łatwo jest napisać @daily job1; job2. Jeśli ważne jest, aby zadania były wykonywane w kolejności, uczyń to bezpośrednią konsekwencją tego, co piszesz.

Ponadto wyraźne określenie kolejności eliminuje ryzyko, że przyszły administrator zmieni kolejność linii, uważając, że nie będzie to miało znaczenia.

Gilles „SO- przestań być zły”
źródło
5

http://ss64.com/osx/crontab.html (a także inne odniesienia) mówi, że @daily jest równoważne z

0 0 * * *

który mówi, że ma biec o północy. Spodziewałbym się, że dwie linie tego typu zostaną uruchomione tak blisko północy, jak to możliwe, bez żadnej gwarancji, która z nich będzie pierwsza. Zgadzam się z sugestią jw013 w jego komentarzu:

Fakt, że nie jest on określony, zwykle oznacza, że ​​należy do implementacji i zwykle najlepiej nie polegać na takim zachowaniu. Prawdopodobnie jest bardziej przejrzysty i lepiej zorganizowany, aby umieścić sekwencję zadań, w których sekwencja ma znaczenie we własnym skrypcie, a nie jako osobne wpisy crontab.

Tom Barron
źródło
To pomaga, dzięki. Zgadzam się, że sugestia @ jw013 jest poprawna, ale nie o to pytałem. Chyba będę musiał skonsultować się z rzeczywistym źródłem ostatecznej odpowiedzi, ponieważ prawdopodobnie jest to konkretnie specyficzne dla implementacji.
Adam Monsen,
0

@Giles komentuje użycie pojedynczego skryptu podczas importowania, aby uruchamiać rzeczy w odpowiedniej kolejności.

cron.dailypliki nie określają czasów uruchamiania. Z mojego doświadczenia wynika, że ​​biegną one szeregowo. Ma to sens, jak wiele zadań w tle, które mogą działać na laptopie lub innym systemie

Po określeniu czasów uruchamiane są wszystkie zadania zaplanowane na bieżącą minutę. Dobrym pomysłem jest używanie różnych czasów.

Jeśli masz zadania, które wykluczają się wzajemnie, często używa się pliku blokady, aby ustalić, czy inne zadanie jest uruchomione.

BillThor
źródło
@dailyjest nieco inny niż /etc/cron.daily. Pierwsza z nich to alternatywna składnia do użycia w crontabie. Zobacz także run-parts. Mój system używa run-partsdo uruchamiania programów /etc/cron.daily. Według strony run-parts(8)podręcznika: „Pliki są uruchamiane w porządku leksykalnym według ich nazw ...”.
Adam Monsen,