Wie verhindert man, dass Cron stampft?

13

Angenommen, ich habe mehrere Cron-Skripte, die alle 15 Minuten ausgeführt werden müssen. Ich könnte sie zum Laufen bringen:, */15 * * * *aber dann laufen sie alle zur gleichen Zeit. Es erscheint unsinnig, wenn der Server mehrere Minuten im Leerlauf bleibt und dann plötzlich versucht, ein Dutzend Skripte gleichzeitig auszuführen.

Gibt es eine Möglichkeit, ein Skript in Minute 1, 16, 31, 46 und ein anderes in Minute 2, 17, 32, 47 ausführen zu lassen?

Mit anderen Worten, ich möchte, dass jedes Skript alle 15 Minuten ausgeführt wird, aber es ist mir egal, dass sie speziell für die Viertelstunden ausgeführt werden.

Buttons840
quelle

Antworten:

7

Du machst es dir schwerer, als es sein muss. Setzen Sie sie alle in die gleiche Zeile, durch Semikolons getrennt:

*/15 * * * * command1 ; command 2 ; command 3

Es wird ausgeführt command1, bis es fertig ist, und dann ausgeführt command2, bis es fertig ist und so weiter.

laebshade
quelle
15

Wenn Sie Ihren Cron-Job so gestalten: 6-59/15 * * * *Er wird nach 6, 21, 36 und 51 Minuten nach der vollen Stunde ausgeführt.

Dies funktioniert möglicherweise nicht mit allen Versionen von cron.

Ladadadada
quelle
14

Sie könnten beispielsweise alle Skripte in ein Verzeichnis stellen /etc/cron.15mund dann cron ausführen lassen

*/15 * * * * run-parts /etc/cron.15m

Vorausgesetzt, Sie haben den run-partsBefehl. Es ist zumindest auf allen Debian-basierten Systemen vorhanden. Es werden alle ausführbaren Programme im angegebenen Verzeichnis nacheinander in Listenreihenfolge ausgeführt.

Ein Nachteil dieser Methode ist, dass, wenn eines der Skripte hängt, alle anderen warten und nicht ausgeführt werden. Wenn die Laufzeit von allen mehr als 15 Minuten beträgt, wird der Job wieder ausgeführt und es kann zu einer Häufung von Prozessen kommen.

Andrew Schulman
quelle
run-partsist auch in Fedora / Red Hat-Systemen vorhanden.
Mattdm
9

Der einfachste Weg, dies zu tun, besteht darin, die auszuführenden Befehle manuell einzurichten, wenn Sie dies möchten:

0,15,30,45 * * * * command0
1,16,31,46 * * * * command1
2,17,32,47 * * * * command2
...
14,29,44,59 * * * * command14

Sie können auch ein Skript schreiben, um die entsprechenden crontab-Einträge automatisch zu generieren (wodurch Tippfehler vermieden werden).

Einige Versionen von cron (wahrscheinlich auch die von Ihnen verwendete) akzeptieren eine erweiterte Syntax:

0-59/15 * * * * command0
1-59/15 * * * * command1
1-59/15 * * * * command2
...
14-59/15 * * * * command14
Keith Thompson
quelle
0

Cron ist nicht wirklich gut in dem, was du versuchst zu tun. Haben Sie darüber nachgedacht, ein Skript zu schreiben, das als Dämon fungiert, der im Grunde 15 Minuten lang ruht, den Befehl ausführt und dann eine Schleife durchläuft?

Matt Simmons
quelle
1
Es gibt ein paar mögliche Probleme damit. Eine davon ist , dass , wenn Sie tun , sleep 300zwischen jeder Ausführung des Befehls, der eigene Ausführung des Befehls wird die Zeit Drift verursachen; Es wird möglicherweise um 15:10 Uhr und nicht um 15:00 Uhr ausgeführt. Und wenn der Hintergrundprozess abbricht oder das System anders als neu startet, crondwird es nicht automatisch neu gestartet. Es gibt Möglichkeiten, einen Hintergrundprozess zu "dämonisieren", aber dann implementieren Sie ihn so gut wie neu crond.
Keith Thompson
Ja, ich bin damit einverstanden, dass es keine perfekte Lösung ist (obwohl Sie die Aufgabe immer mit & hinterlegen könnten), aber los geht's.
Matt Simmons
1
Lassen Sie stattdessen einfach ein einzelnes Skript ausführen, das alle Befehle der Reihe nach ausführt. Tatsächlich ist es so ein allgemeines Bedürfnis, dass es ein Standard-Skript gibt, run-partsdas mit den meisten Cron-Installationen geliefert wird, um genau das zu tun. Siehe @ AndrewSchulmans Antwort.
Tyler
0

Viele Distributionen haben /etc/cron.d/cronhourly, für die alle Skripte innerhalb stündlich ausgeführt werden. Sie können die Reihenfolge sogar festlegen, indem Sie sie mit fortlaufenden Nummern beginnen, wie 01scriptA 02scriptB - es sollte trivial sein, dass Sie bereits ein "cronhourlybyfour" herstellen müssen, wie wir es auf der Linux-Distribution von Smoothwall nennen :)

Hinweis: Dies verwendet Run-Parts wie zuvor vorgeschlagen und Run-Parts mag keine Skripte mit einem. Nennen Sie es im Namen also nicht "deletehomefolders.sh", sondern "01deletehomefolders" und stellen Sie sicher, dass Sie mit dem richtigen # beginnen! Zeile für was auch immer Sie beabsichtigen, Ihr Skript zu interpretieren.

Tom Newton
quelle