Wie genau ist ein Cron-Daemon?

22

Ist der Cron Job Scheduler wirklich genau?

Ich meine, ich brauche ein Skript, um jede Nacht die späteste Zeit auszuführen, ABER vor 00:00 Uhr des nächsten Tages.

Ich würde im Idealfall um 23.59 Uhr (oder 23:59 Uhr) einen Cron-Job ausführen, aber wird das System wirklich präzise sein? Sollte ich den Cron-Job auf 23:58 setzen, damit er eine Weile verbleibt?

Sebastian
quelle
13
Warum haben Sie diese Anforderungen? Ich habe das Gefühl, es wird einen besseren Weg geben, um das zu tun, was Sie wirklich versuchen, und Sie könnten genauso gut danach fragen. (Es wird ein bisschen mehr Aufwand erfordern, als nur einen Cron-Job zu planen, aber vielleicht nicht viel mehr.)
David Z
Früher habe ich einen alten Dummkopf mit einer Genauigkeit von 10 Minuten benutzt.
Joshudson
7
Ihre Anforderung erscheint mir nicht sehr zuverlässig. Was tun Sie, wenn Ihr System gegen Mitternacht stark ausgelastet ist? Ohne ein RT-System können Sie nichts garantieren.
Thomas Erker
Bedenken Sie, dass auch wenn Sie es schaffen, einen Server zu beschaffen, der immer verfügbar ist und Ihren Job immer in weniger als einer Sekunde erledigt, es immer noch Dinge gibt, die schief gehen können. Zum Beispiel kann Ihre Uhr anfangen zu driften, ohne dass Sie es merken. Das ist wirklich sehr, sehr fragil und ich stimme den obigen Kommentaren zu, dass das System geändert werden muss.
Chris Hayes

Antworten:

24

Was Cron garantieren kann, ist, dass Ihr Job nicht früher als zur angegebenen Zeit startet (abhängig von der Genauigkeit der Systemuhr). Sie können jedoch keine Garantie für die Beendigung des Auftrags geben. Es wird von vielen Faktoren abhängen:

  • Wie geladen ist das System?
  • Was macht der Job?
  • Langsamkeit aufgrund von Hardwareproblemen
  • Langsamkeit aufgrund von Netzwerkproblemen (vorausgesetzt, der Job hängt vom Netzwerk ab)

Ich empfehle, Ihr Design so zu ändern, dass eine bestimmte Fertigstellungszeit nicht erforderlich ist.

Kasperd
quelle
1
Der einfachste Weg, dies zu tun, besteht wahrscheinlich darin, den Job, der über cron gestartet wird, eine Datei erstellen zu lassen, die anzeigt, dass er ausgeführt wird und beim Beenden des Jobs (erfolgreich oder erfolglos) gelöscht wird, und dann den nächsten Job (vorausgesetzt, dies ist der Zweck). Warten Sie, bis die Datei verschwindet, bevor Sie etwas tun.
ein Lebenslauf vom
@ MichaelKjörling Du solltest ein Verzeichnis anstatt einer Datei verwenden, da es nicht atomar ist, nach einer Datei zu suchen und sie dann zu erstellen .
8bittree,
1
@ 8bittree Sie können auch Flock verwenden, wenn es verfügbar ist.
user9517 unterstützt GoFundMonica
1
@ MichaelKjörling Aber warum mit dem evtl. okayfall stören, wenn der richtige Fall auch einfacher ist?
8bittree,
4
@ 8bittree Wenn Sie O_CREATand O_EXCLflags verwenden, ist dies atomar, solange sich die Datei auf einem lokalen Dateisystem befindet.
Kasperd
14

Ich nehme an, das hängt von Ihrem Cron-Daemon ab, aber die Dokumentation und der Standard geben an, dass der Job zur angegebenen Minute ausgeführt wird, wenn Sie Minuten angeben.

Sehen:

Beachten Sie, dass Ihr Skript gestartet wird, wenn die Uhr auf die richtige Zeit umschaltet, aber einige Zeit später beendet wird.

Falcon Momot
quelle
Ich habe einen virtuellen Server mit sehr geringer Auslastung, und dennoch wird ein Cron, der so eingestellt ist, dass er jede Minute ausgeführt wird, manchmal bei 0s, 1s, 2s, manchmal bis zu 17s gestartet. Ich vermute, dass cron auf einem virtuellen Server möglicherweise ungenauer ist, da andere Prozesse außerhalb dieses Servers die Verfügbarkeit von Ressourcen wie z. B. der CPU beeinträchtigen können.
Liam
8

Normalerweise startet cron um 23:59:00 Uhr , scannt alle Ihre crontab-Dateien, filtert diejenigen heraus, die für 23:59 relevant sind, und startet sie dann. Das Scannen dieser Dateien ist sehr schnell, da es nicht viele davon gibt und alle nur wenige Zeilen enthalten. Normalerweise beginnen die Cronjobs um 23:59:00 oder 23:59:01. Es gibt sichere Möglichkeiten, diesen Prozess absichtlich zu verlangsamen. (Fügen Sie der Crontab beispielsweise Millionen von Zeilen hinzu.) Wenn das System vollständig überlastet ist, funktioniert dies auch nicht so schnell.

Auch dies ist offensichtlich implementierungsabhängig.

Wenn Sie sehr genaue Startzeiten benötigen, ist es besser, ein Programm zu erstellen, das sich bis zur gewünschten Zeit im Ruhezustand befindet und dann ausgeführt wird (z. B. mit c ++ 11 ). Aber auf einem Nicht-Echtzeit-Betriebssystem ist dies auch nicht exakt! Auch die Uhr des PCs kennt die genaue Uhrzeit nicht!

In allen Fällen wird nur sichergestellt, dass das Programm zu der von Ihnen gewünschten Zeit (mehr oder weniger) startet . Es gibt keine Garantie dafür, dass das Programm bis zu einem bestimmten Zeitpunkt erfolgreich beendet wird. Ich bin daher der festen Überzeugung, dass Sie an dieser Anforderung etwas ändern sollten.

Josef
quelle
2
Ich glaube, die crontabs werden im Speicher gehalten - wenn Sie die Dateien hinter crontab direkt bearbeiten (anstelle von crontab -e, das cron benachrichtigt, wenn die Änderungen abgeschlossen sind), werden die Änderungen nicht wirksam. cron hat Unmengen von Ausfallzeiten, um herauszufinden, welche Jobs anstehen. Es kann "schlafen", bis die genaue Sekunde erreicht ist, in der der Job ausgeführt werden soll.
AMADANON Inc.
0

Dies hängt von Ihrer gesamten Skriptausführungszeit und der Genauigkeit der Serverzeit ab.

59 23 * * * /some/script/file.sh

Das Skript wird genau um 23:59 Uhr gestartet. Wenn Sie jedoch einige Befehle haben, die lange funktionieren, wird ein Teil des Skripts möglicherweise nach Mitternacht ausgeführt.

komischer Mann
quelle
genau um 23:59 , also kann es von 23:59:00 bis 23:59:59 sein?
AL
2
Sie haben keine Sekunden in normalen Cron. Um diese zusätzlichen 59 Sekunden zu erhalten, müssen Sie ein 'wait (59)' am oberen Rand Ihres Codes einfügen.
Henry's Cat
4
@AL in der Praxis habe ich immer gesehen, wie es mit xx: xx: 00 oder xx: xx: 01 lief, aber auf einem stark ausgelasteten System gibt es keine Versprechungen und es kann keine geben.
Hobbs