Frage Crond Offset-Fünf-Minuten-Zeitplan


Ist es möglich, einen Cron-Skriptsatz so einzustellen, dass er 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 einige hübsche Berichte. Beide Skripts müssen alle 5 Minuten ausgeführt werden. Ich möchte Skript 2 um eine Minute versetzen, damit es aus den neuen Daten einen Bericht erstellen kann. Z.B. Ich möchte, dass ein Script läuft :00, :05, :10, :15 [...] und Skript zwei um zu laufen :01, :06, :11, :16 [...] jede Stunde. Die Skripts sind nicht voneinander abhängig und Skript 2 muss unabhängig davon ausgeführt werden, ob Skript eins erfolgreich war oder nicht. Aber es wäre nützlich, wenn die Berichte die neuesten Daten hätten. Ist das mit Cron möglich?

Post;
Ich habe darüber nachgedacht, beide Befehle in einem Shell-Skript zu verwenden, so dass sie sofort hintereinander ausgeführt werden, aber das würde nicht funktionieren. Manchmal kann Skript 1 beim Warten auf externe APIs aufhängen, so dass es bis zu 15 Minuten dauern kann Skript 2 muss alle 5 Minuten ausgeführt werden, so dass es die Ausführung von Skript 2 stoppt / verzögert. Wenn ich das in Cron einstellen könnte, würde das bedeuten, dass Skript 2 unabhängig von Skript 1 ausgeführt würde


21
2017-07-02 14:27


Ursprung




Antworten:


Sie können Skripts jederzeit ausführen, wenn Sie möchten cron. Wenn Sie Skript 1 alle 5 Minuten ausführen möchten, können Sie wie folgt beginnen:

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

Aber das ist eigentlich 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 Folgendes 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 zu Beginn von Skript 2, schlafe für eine Minute:

sleep 60

13
2017-07-02 14:37



Das Einschlafen in das Skript selbst ist ein hässlicher Hack, der das Ausführen des Skripts per Hand von der Eingabeaufforderung aus schmerzhaft macht. Da ist ein weniger hässliche Art, das zu hacken Indem Sie den Sleep-Teil des Crontab-Eintrags machen, ist es sogar noch eleganter, die Jobs nur mit der korrekten Crontab-Notation zu verrechnen, auf die Ihre Antwort nicht anspricht. - Caleb


Das Minuteneingabefeld für crontab akzeptiert einen "Inkremente" -Operator, der etwas verwirrend ist, weil es aussieht, als sollte es ein mathematischer "dividiere durch" -Operator sein, ist es aber nicht. Sie werden es am häufigsten wie folgt sehen. Beachten Sie, dass Zahlen, die durch fünf teilbar sind, nicht gefunden werden, sondern jedes fünfte Element aus einer Menge genommen wird:

 */5 * * * * command

Das sagt Cron, dass es mit jedem fünften Gegenstand übereinstimmt (/5) aus der Reihe Minuten 0-59 (*), aber Sie können das Set wie folgt ändern:

 1-59/5 * * * * command

Dies würde jeden fünften Gegenstand von der Reihe 1-59 nehmen und deinen Befehl in den Minuten 6, 11, 16 usw. ausführen.

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

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

Dies würde Ihren Job alle fünf Minuten ausführen, aber der Befehl würde erst 15 Sekunden nach der Minute starten. Für kurz laufende Jobs, bei denen ein paar Sekunden, nachdem etwas anderes den Unterschied gemacht hat, aber Sie nicht eine volle Minute zu spät sein wollen, ist dies ein einfacher Hack.


39
2017-09-18 09:36



Dies ist eine bessere Antwort als die akzeptierte. Das Einstellen des Versatzes über den Bereich ist viel sauberer als das Schlafen. - ND Geek


Sie können einen Zeitversatz mit dem Symbol + angeben. Zum Beispiel um zu starten :01, :06, :11, :16 [...], erstelle eine Aufgabe wie

*/5+1 * * * * command

11
2017-12-14 01:34



Dies scheint in einigen Versionen von Cron nicht zu funktionieren - jhoff
Welche Version von Cron verwenden Sie, die diese Syntax unterstützt? Cronie scheint das nicht zu unterstützen. - Matthew G
Ich habe Cronie auf CentOS7, also werde ich diese Lösung nicht zuerst versuchen. - AnneTheAgile