Frage Wie genau ist ein Cron-Daemon?


Ist der Cron Job Scheduler Ja wirklich präzise?

Ich meine, ich brauche ein Skript, um jede Nacht das neueste möglich zu machen, ABER vor 00:00 des nächsten Tages.

Ich würde idealerweise einen Cron-Job um 23.59 (oder 23.59 Uhr) laufen lassen, aber wird das System wirklich genau sein? Da eine Sekunde von Bedeutung ist, sollte ich den Cron-Job auf 23:58 einstellen, um es einige Zeit zu lassen?


20
2017-09-09 06:20


Ursprung


Warum haben Sie diese Anforderungen? Ich habe das Gefühl, dass es einen besseren Weg geben wird, zu tun, was auch immer Sie wirklich tun wollen, und Sie könnten genauso gut danach fragen. (Es wird etwas mehr Aufwand erfordern, als nur einen Cron-Job zu planen, aber vielleicht nicht viel mehr.) - David Z
Ich benutzte einen alten dummen Cron mit einer Genauigkeit von 10 Minuten. - joshudson
Ihre Anforderung sieht für mich nicht sehr zuverlässig aus. Was tun Sie, wenn Ihr System gegen Mitternacht stark belastet ist? Sofern Sie kein RT-System haben, können Sie nichts garantieren. - Thomas Erker
Bedenken Sie, dass selbst wenn es Ihnen gelingt, einen Server zu beschaffen, der immer verfügbar ist und Ihren Job immer in weniger als einer Sekunde erledigen kann, es dennoch Dinge gibt, die schief gehen können. Zum Beispiel kann deine Uhr anfangen zu driften, ohne dass du es merkst. Das ist wirklich sehr fragil, und ich stimme den obigen Ausführungen zu, dass das System sich ändern muss. - Chris Hayes


Antworten:


Was Cron garantieren kann, ist, dass Ihre Arbeit nicht früher als die angegebene Zeit beginnt (abhängig von der Genauigkeit der Systemuhr). Aber es gibt keine Garantie für die Abbruchzeit des Jobs. Es hängt von vielen Faktoren ab:

  • Wie geladen ist das System?
  • Was macht der Job?
  • Langsamkeit aufgrund von Hardware-Problemen
  • Langsamkeit aufgrund von Netzwerkproblemen (vorausgesetzt, die Arbeit hängt von der Vernetzung ab)

Ich empfehle Ihnen, Ihr Design so zu ändern, dass eine bestimmte Ausführungszeit nicht erforderlich ist.


24
2017-09-09 06:57



Der einfachste Weg, dies zu tun, ist wahrscheinlich, dass der Job, der durch cron gestartet wird, eine Datei erstellt, die anzeigt, dass sie ausgeführt wird, wenn der Job beendet wird (erfolgreich oder erfolglos) und dann der nächste Job (angenommen, dass dies der Zweck ist). warte, bis die Datei verschwindet, bevor sie etwas tut. - α CVn
@ MichaelKjörling Du solltest lieber ein Verzeichnis als eine Datei verwenden, als Nach einer Datei suchen und dann erstellen ist nicht atomar. - 8bittree
@ 8bittree können Sie verwenden Herde auch wenn es verfügbar ist. - Iain
@ MichaelKjörling Aber warum sollte man sich mit dem vielleicht in Ordnung gehenden Fall beschäftigen, wenn der richtige Fall auch einfacher ist? - 8bittree
@ 8bittree Wenn Sie verwenden O_CREAT und O_EXCL kennzeichnet, dass es unteilbar ist, solange sich die Datei in einem lokalen Dateisystem befindet. - kasperd


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

Sehen:

Seien Sie sich bewusst, dass Ihr Skript gestartet wird, wenn die Uhr zur richtigen Zeit läuft, aber einige Zeit später beendet wird.


14
2017-09-09 06:24





Normalerweise beginnt Cron bei 23:59:00scannen Sie all Ihre Crontab-Dateien, filtern Sie diejenigen heraus, die für Sie relevant sind 23:59 und dann starte sie. Das Scannen dieser Dateien ist sehr schnell, weil es nicht viele von ihnen gibt und sie alle nur ein paar Zeilen enthalten. Normalerweise fangen die Cronjobs an 23:59:00 oder 23:59:01 Es gibt sichere Möglichkeiten, diesen Prozess absichtlich zu verlangsamen. (Fügen Sie beispielsweise Millionen von Zeilen zur crontab hinzu). Wenn das System vollständig überlastet ist, wird dies auch nicht so schnell funktionieren.

Auch dies ist offensichtlich implementierungsabhängig.

Wenn Sie sehr genaue Startzeiten benötigen, sollten Sie ein Programm erstellen, das bis zur gewünschten Zeit ruht und dann ausgeführt wird (z. B. mit C ++ 11). Aber auf einem Nicht-Echtzeit-Betriebssystem wird dies auch nicht genau sein! Auch die Uhr des PC kennt die genaue Uhrzeit nicht!

In allen Fällen stellt dies nur das Programm sicher beginnt um (mehr oder weniger) die Zeit, die Sie wollen. Es kann keine Garantie für das Programm geben endet erfolgreich bis zu einer bestimmten Zeit, also glaube ich stark, dass Sie etwas an dieser Anforderung ändern sollten.


8
2017-09-09 15:28



Ich glaube, dass die crontabs im Speicher gehalten werden - wenn Sie die Dateien hinter crontab direkt editieren (anstelle von crontab -e, das Cron benachrichtigt, wenn es abgeschlossen ist), werden die Änderungen nicht wirksam. Cron hat eine Menge Ausfallzeiten, um herauszufinden, welche Jobs anstehen. Es kann "schlafen" bis genau die Sekunde, in der der Job ausgeführt werden soll. - AMADANON Inc.


Dies hängt von der Ausführungszeit und der Genauigkeit der Serverzeit ab.

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

wird dein Skript starten genau um 23:59, aber wenn Sie einige Befehle haben, die lange arbeiten, kann ein Teil des Skripts nach Mitternacht ausgeführt werden.


0
2017-09-09 06:26



genau um 23:59 Uhr