Crond versetzte den Fünf-Minuten-Zeitplan


22

Ist es möglich, ein Cron-Skript-Set so zu versetzen, dass es alle 5 Minuten ausgeführt wird?

Ich habe zwei Skripte, Skript 1 sammelt einige Daten aus einer Datenbank und fügt sie in eine andere ein, Skript 2 holt diese Daten und viele andere Daten heraus und erstellt daraus hübsche Berichte. Beide Skripte müssen alle 5 Minuten ausgeführt werden. Ich möchte Skript 2 um eine Minute versetzen, damit aus den neuen Daten ein Bericht erstellt werden kann. Ich möchte, dass Skript eins :00, :05, :10, :15 [...]und Skript zwei zu :01, :06, :11, :16 [...]jeder vollen Stunde ausgeführt werden. Die Skripte sind nicht voneinander abhängig, und Skript 2 muss unabhängig davon ausgeführt werden, ob Skript 1 erfolgreich war oder nicht. Es wäre jedoch nützlich, wenn die Berichte die neuesten Daten enthalten könnten. Ist das mit cron möglich?

Post;
Ich habe darüber nachgedacht, beide Befehle in einem Shell-Skript zu verwenden, damit sie sofort nacheinander ausgeführt werden, aber das würde nicht funktionieren. Manchmal kann es passieren, dass Skript 1 nicht mehr auf externe APIs usw. wartet. Die Ausführung kann also bis zu 15 Minuten dauern Skript 2 muss alle 5 Minuten ausgeführt werden. Wenn Sie dies tun, wird die Ausführung von Skript 2 gestoppt / verzögert. Wenn ich dies in Cron festlegen könnte, würde Skript 2 ausgeführt, unabhängig davon, was Skript 1 ausführt

Antworten:


14

Sie können Skripte ausführen, wann immer Sie möchten cron. Wenn Sie Skript 1 alle 5 Minuten ausführen möchten, könnten Sie folgendermaßen beginnen:

*/5 * * * * /path/to/script1

Aber das ist wirklich nur eine Abkürzung für:

0,5,10,15,20,25,30,35,40,45,50,55 * * * * /path/to/script1

Wenn Sie Skript 2 eine Minute nach Skript 1 ausführen möchten, können Sie dies tun:

1,6,11,16,21,26,31,36,41,46,51,56 * * * * /path/to/script2

Sie könnten dies auch tun:

*/5 * * * * /path/to/script1
*/5 * * * * /path/to/script2

Und dann schlafen Sie zu Beginn von Skript 2 eine Minute lang:

sleep 60

4
Das Einschlafen des Skripts selbst ist ein hässlicher Hack, der es schmerzhaft macht, das Skript von der Eingabeaufforderung aus von Hand auszuführen. Es gibt einen weniger hässlichen Weg, dies zu hacken, indem Sie den Schlaf-Teil des Crontab-Eintrags machen. Noch eleganter ist es jedoch, die Jobs mit der richtigen Crontab-Notation auszugleichen, die Ihre Antwort nicht berührt.
Caleb

39

Das Minuten-Eingabefeld für crontab akzeptiert einen "Inkremente von" -Operator, der etwas verwirrend ist, weil es so aussieht, als ob es ein mathematischer "Division durch" -Operator sein sollte, aber nicht. Sie werden am häufigsten feststellen, dass es wie folgt verwendet wird. Beachten Sie, dass dies keine durch fünf teilbaren Zahlen findet, sondern jeden fünften Punkt aus einer Menge entnimmt:

 */5 * * * * command

Dies weist cron an, jedes fünfte Element ( /5) aus dem Satz von Minuten 0-59 ( *) zuzuordnen, aber Sie können den Satz folgendermaßen ändern:

 1-59/5 * * * * command

Dies würde jeden fünften Gegenstand aus dem Satz 1-59 nehmen und Ihren Befehl bei den Minuten 6, 11, 16 usw. ausführen.

Wenn Sie mehr feinkörnige Offsets als eine Minute benötigen, können Sie diese mit dem Befehl sleep als Teil Ihrer crontab wie folgt hacken:

 */5 * * * * sleep 15 && command

Dadurch wird Ihr Job alle fünf Minuten ausgeführt, der Befehl wird jedoch erst 15 Sekunden nach der Minute gestartet. Für Jobs mit kurzen Laufzeiten, bei denen es entscheidend ist, ein paar Sekunden nach etwas anderem zu sein, aber Sie nicht eine volle Minute zu spät kommen möchten, ist dies ein einfacher Hack.


1
Dies ist eine bessere Antwort als die akzeptierte. Die Einstellung des Offsets über den Bereich ist viel sauberer als das Schlafen.
ND Geek

11

Sie können einen Zeitversatz mit dem Symbol + angeben. Um beispielsweise um auszuführen :01, :06, :11, :16 [...], erstellen Sie eine Aufgabe wie

*/5+1 * * * * command

7
Dies scheint in einigen Versionen von cron
jhoff

1
Welche Cron-Version unterstützt diese Syntax? Cronie scheint es nicht zu unterstützen.
Matthew G

Ich habe Cronie auf CentOS7, daher werde ich diese Lösung nicht zuerst ausprobieren.
AnneTheAgile

1

Das hat bei mir funktioniert:

1/5 * ? * * *

Wobei 1 die versetzten Minuten sind. Wenn Sie also drei Minuten versetzen möchten:

3/5 * ? * * *

Ich habe dies in AWS Zeitplaneinstellungen arbeiten

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.