Werden mehrere @ Daily Crontab-Einträge nacheinander verarbeitet?

22

Ich möchte, dass zwei Jobs jeden Tag in genau der angegebenen Reihenfolge ausgeführt werden. Wird diese Crontab zuverlässig tun, was ich will?

@daily job1
@daily job2

Ich gehe davon aus sie einen nach dem anderen laufen, aber ich war nicht in der Lage , die Antwort zu finden , indem die Web oder von einem dieses manpages suchen: cron(1), crontab(1), crontab(5).

Die obige Crontab macht offensichtlich nicht das, was ich will, wenn Cron Dinge @dailyparallel oder in einer unvorhersehbaren Reihenfolge ausführt.

Ich weiß, dass ich einfach ein Shell-Skript erstellen kann, um sie in der richtigen Reihenfolge auszulösen. Ich bin nur neugierig, wie Cron funktionieren soll (und ich bin zu faul, um Testdaten zu sammeln oder den Quellcode zu lesen).

Cron ist im cronLieferumfang enthalten. Betriebssystem ist Ubuntu 10.04 LTS (Server).

Adam Monsen
quelle
Wissen Sie zufällig, welcher Cron im cronPaket enthalten ist? Fast alle Cron-Daemons, die ich kenne, verarbeiten dies in der Reihenfolge und synchron, indem sie normalerweise zuerst jede Datei in alphabetischer Reihenfolge analysieren (obwohl einige dies in aufsteigender Reihenfolge nach der Zeitspanne zwischen den einzelnen Abläufen tun) und dann die darin enthaltenen Jobs in Zeilenreihenfolge.
Chris Down
5
Die Tatsache, dass es unterbestimmt ist, bedeutet normalerweise, dass es der Implementierung überlassen bleibt, und es ist normalerweise am besten, sich nicht auf ein solches Verhalten zu verlassen. Es ist wahrscheinlich übersichtlicher und übersichtlicher, eine Folge von Jobs dort zu platzieren, wo die Folge in einem eigenen Skript wichtig ist, anstatt als separate crontab-Einträge.
jw013
@ ChrisDown: Vixie Cron, denke ich. packages.ubuntu.com/lucid/cron
Adam Monsen
1
Ich würde vorschlagen, wenn Sie sie wirklich der Reihe nach ausführen möchten, lassen Sie eine eine Minute später ausführen.
Kevin
@ jw013 und Kevin: einverstanden, aber das ist nicht meine Frage.
Adam Monsen

Antworten:

26

Nach einem kurzen Blick auf den Quellcode (in Debian Squeeze, von dem ich glaube, dass es dieselbe Version ist) sieht es so aus, als ob Einträge in einer bestimmten Datei und zu denselben Zeiten in der angegebenen Reihenfolge ausgeführt werden. Zu diesem Zweck @dailyund 0 0 * * *sind identisch (in der Tat @dailyist identisch mit 0 0 * * *in diesem Cron).

Darauf würde ich mich nicht auf ganzer Linie verlassen. Es ist möglich, dass eines Tages jemand entscheidet, dass cron Jobs parallel ausführen soll, um die Vorteile dieser 32-Kern-CPUs mit 31 Kernen im Leerlauf zu nutzen. Dies kann geschehen, wenn dieses 20 Jahre alte Aufgabenelement in der Cron-Quelle implementiert wird:

All dies sollte gekennzeichnet und lastbegrenzt sein. dh anstelle von @hourly, was "0 * * * *" bedeutet, sollte dies "fast zu jeder vollen Stunde, aber nicht, bis die Systemlast niedrig ist" bedeuten. (…) (Vix, jan90)

Es ist sehr einfach, @daily job1; job2hier zu schreiben . Wenn es wichtig ist, dass die Jobs in der richtigen Reihenfolge ausgeführt werden, führen Sie dies direkt aus.

Durch die explizite Angabe der Reihenfolge wird außerdem das Risiko beseitigt, dass ein zukünftiger Administrator die Zeilen neu anordnet, da er denkt, dass dies keine Rolle spielt.

Gilles 'SO - hör auf böse zu sein'
quelle
5

http://ss64.com/osx/crontab.html (sowie andere Verweise) besagt, dass @daily äquivalent zu ist

0 0 * * *

die sagt, um Mitternacht zu laufen. Ich würde erwarten, dass zwei Linien dieser Art so kurz wie möglich um Mitternacht gestartet werden, ohne Garantie, welche zuerst laufen würde. Ich stimme dem Vorschlag von jw013 in seinem Kommentar zu:

Die Tatsache, dass es unterbestimmt ist, bedeutet normalerweise, dass es der Implementierung überlassen bleibt, und es ist normalerweise am besten, sich nicht auf ein solches Verhalten zu verlassen. Es ist wahrscheinlich übersichtlicher und übersichtlicher, eine Folge von Jobs dort zu platzieren, wo die Folge in einem eigenen Skript wichtig ist, anstatt als separate crontab-Einträge.

Tom Barron
quelle
Das hilft, danke. Ich bin damit einverstanden, dass der Vorschlag von @jw013 gültig ist, aber das ist nicht die Frage, die ich gestellt habe. Ich denke, ich muss die tatsächliche Quelle für die endgültige Antwort konsultieren, da dies wahrscheinlich tatsächlich implementierungsspezifisch ist.
Adam Monsen
0

@Giles kommentiert die Verwendung eines einzelnen Skripts, wenn es importiert wird, um die Dinge in der richtigen Reihenfolge auszuführen.

cron.dailyDateien geben keine Laufzeiten an. Es ist meine Erfahrung, dass sie seriell laufen. Dies ist sinnvoll, da viele Hintergrundjobs möglicherweise auf einem Laptop oder einem anderen System ausgeführt werden

Wenn Zeiten angegeben werden, werden alle Jobs ausgeführt, die für die aktuelle Minute geplant sind. Es ist eine gute Idee, verschiedene Zeiten zu verwenden.

Wenn Sie Aufträge haben, die sich gegenseitig ausschließen, wird häufig mithilfe einer Sperrdatei festgestellt, ob der andere Auftrag ausgeführt wird.

BillThor
quelle
@dailyist etwas anders als /etc/cron.daily. Ersteres ist eine alternative Syntax für die Verwendung in einer Crontab. Schauen Sie sich auch an run-parts. Auf meinem System werden run-partsProgramme ausgeführt /etc/cron.daily. Laut der run-parts(8)Manpage werden "Dateien in der lexikalischen Sortierreihenfolge ihrer Namen ausgeführt ...".
Adam Monsen