Wie funktionieren die Interna des Cron-Daemons?

7

Ich möchte wissen, wie cronintern funktioniert. Überprüft der Prozess weiterhin die aktuelle Zeit in einer Endlos-while-Schleife (wodurch kontinuierlich CPU-Zyklen verbraucht werden)? Oder generiert eine Funktion einen Interrupt und benachrichtigt den cronDaemon?

avi
quelle

Antworten:

9

Ich habe einmal den Vixie-Cron-Quellcode gelesen und musste ins Krankenhaus. Wenn Sie jedoch zu einem späteren Zeitpunkt nach "einer Funktion, die einen Interrupt generiert" suchen, sollten Sie den alarm(2)Systemaufruf untersuchen. Der Kernel wird aufgefordert, Ihnen das Signal SIGALRMzu einem festgelegten Zeitpunkt zu senden , das Sie dann abfangen können. In der Zwischenzeit kann Ihr Prozess etwas anderes tun, oder sleep()wie ich es im Krankenhaus getan habe.

Ruief
quelle
4
Upvoted für Humor.
4ae1e1
6

Ich bin mir sicher, dass es viele Variationen gibt. Die Funktionsweise von dcron (auch bekannt als Dillons Cron-Daemon) besteht darin, dass es jeweils bis zu 60 Sekunden lang schläft. Es versucht, dies zu synchronisieren, indem es bei Bedarf weniger schläft, um aufzuwachen 00 Sekunden jeder Minute.

Es verwendet, sleep()wodurch der Prozess in den Ruhezustand versetzt wird (sofern kein Signal auftritt), ohne die CPU zu verwenden. Wenn es aufwacht, sucht es nach einer Datei cron.update(erstellt durch crontabBearbeiten). Bei Bedarf wird die Ausführungswarteschlange neu erstellt, die erwarteten Aufgaben ausgeführt und der Ruhezustand erneut ausgeführt.

Mindestens ein Cron-Daemon ( fcrond) verwendet anstelle eines Sleep / Check-Ansatzes ein Signal, das durch Crontab-Bearbeitung an den Cron-Daemon gesendet wird.

Ich habe noch nie einen Crond gesehen, der Dinge häufiger als einmal pro Minute ausführt, daher sind die Ressourcen normalerweise recht sparsam.

Wenn Sie sich unter Linux /procDinge wie gelesene / geschriebene Bytes oder iowait ansehen, stellen crondSie möglicherweise fest, dass die Nutzung relativ hoch ist. Dies liegt daran, dass letztendlich alle untergeordneten Prozesse berücksichtigt werden, die gestartet werden, z. B. unter CentOS 5.x:

# grep "^[rw]" /proc/`pgrep crond`/io
rchar: 153463658151
wchar: 91095820045
read_bytes: 44480745472
write_bytes: 2261389312

(Dank geplanter Paketaktualisierungen und ASLR / Pre-Link-Aufgaben in diesem Fall)

Siehe auch /programming/3982957/how-does-cron-internally-schedule-jobs .

mr.spuratic
quelle
1
Es gibt mindestens eine Ausnahme: fcronWacht nicht jede Minute auf, nur um zu überprüfen, ob etwas zu tun ist. "Dann berechnet fcron die Uhrzeit und das Datum der nächsten Ausführung jedes Jobs und bestimmt, wie lange er schlafen muss und wie lange er schläft." - Mann fcron
Manatwork
Netter, der nicht vertraut ist fcrond, hat nur die Quelle überprüft: Es ruft einen Helfer auf, um das HUP crond.
mr.spuratic