Gibt es eine Möglichkeit, auf cron
zuzugreifen Timer und erhalten die verbleibenden Sekunden bis zur nächsten Ausführung von Skripten in der crontab
oder vielleicht die Sekunden seit dem letzten?
Akzeptierte Antwort:
Nicht einfach. crond wartet auf ein Signal vom Kernel und geht schlafen. Wenn es das Signal erhält, prüft es, ob in dieser Minute Cronjobs ausgeführt werden müssen, startet diese und geht wieder in den Ruhezustand.
Es ist ein sehr effizientes Design – cron verwendet keine CPU, während es schläft. Es hat auch kein Bewusstsein dafür, dass die Zeit vergeht. Wenn es in den Ruhezustand übergeht, setzt es ein „Timeout“, basierend darauf, wie lange es dauert, bis der nächste Befehl von einem „registrierten“ Cronjob ausgeführt werden muss.
Unter Solaris 10:
sol10-primary:/> # pflags 271
271: /usr/sbin/cron
data model = _ILP32 flags = ORPHAN|MSACCT|MSFORK
/1: flags = ASLEEP pollsys(0x8047c70,0x1,0x8047ce8,0x806ba00)
Während Sie den Cron-Daemon verfolgen, werden Sie sehen, dass er mit einer Zeitüberschreitung in den Ruhezustand wechselt, wie unten:
waitid(P_ALL, 0, 0x08047CD0, WEXITED|WTRAPPED|WNOHANG) Err#10 ECHILD
time() = 1361952435
pollsys(0x08047C70, 1, 0x08047CE8, 0x0806BA00) (sleeping...)
fd=3 ev=POLLRDNORM rev=0
timeout: 105.000000000 sec
sigmask = 0 0 0 0
Wenn Sie einen Cron-Job aktualisieren, wird der schlafende Prozess ebenfalls aufgeweckt, aber um seine eigene Konfiguration zu aktualisieren, wonach er mit dem neuen Timeout-Wert wieder in den Ruhezustand wechselt.
Es ist möglich, das eingestellte Timeout zu sehen. Beachten Sie, dass cron den Systemaufruf time kurz vor dem Einschlafen aufgerufen hat (was die Sekunden seit dem epoc zurückgibt). Wenn Sie dies also beobachtet haben (d. h. den Prozess nachverfolgt haben, als er den Systemaufruf time() aufgerufen hat), können Sie subtrahieren diese Zeit von der aktuellen und vergleichen Sie sie mit der Zeitüberschreitung, die für den pollsys-Aufruf festgelegt wurde.
Also… wie gesagt, nicht so einfach.