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

Verschmieren
quelle

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
larsks
quelle
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.

Caleb
quelle
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
Kurt
quelle
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

Zymotik
quelle