Was tun, wenn ich ein Shellskript schlafen legen moechte, bis die Systemuhr einen bestimmten Wert passiert hat? Was tun, wenn ich das regelmaessig moechte? Ich habe es lange vor mir hergeschoben, nun bin ich die Sache endlich angegangen. Das Ergebnis: Ein kleines Helferlein.

Problemstellung

Folgendes Szenario: Es gibt ein Shell-Skript, das einen bestimmten Job in einer Schleife regelmaessig wiederholen soll. Das ungefaehr nach dem folgenden Schema:

Wie loest man das Warten bis zu einem bestimmten Zeitpunkt? Insbesondere, wenn das Beenden des Jobs keine konstante Zeit benoetigt...?
Wuerde hier ein traditionelles sleep mit konstantem Wert genutzt, wuerde es einen Timeshift geben -- entsprechend dem Warten auf das Beenden des zuletzt gestarteten Jobs.

Konservative Loesungen

Was man im Internet an Loesungen hierzu findet, das laeuft oft genug sinngemaess auf die Loesung der Frage "wie mache ich aus sleep n ein sleep timestamp?"
Entsprechend laeuft es immer auf ein "wie rechne ich eine Differenz zwischen Jetzt und einem Zeitpunkt in Sekunden um?" hinaus. Das vereinfacht das oben geschilderte Problem allerdings nicht wesentlich, denn es buerdet dem Skript noch die Pflicht auf, einen Timestamp zu basteln. Keine der Sachen, die ich gerne in einem Shell-Skript durchexerziere. Vor allem, wenn man die Sonderfaelle bedenkt: Stundenspruenge, Tagesspruenge und die leidige Frage, wie man mit dem Wechsel von Sommer- zu Winterzeit (und umgekehrt) umgehen will. Das muss doch einfacher gehen.

Eigene Loesung

Es geht einfacher. Wenn man sich an die Schoenheit der Modulo-Rechnung besinnt. Das Vereinfacht das Problem deutlich: Anstelle einen Zeitpunkt zu spezifizieren, gebe man einfach den Stunden-, Minuten- oder Sekundenwert an, dessen Rest mit dem jeweils aktuellen Wert des entsprechenden Anteils des Timestamps verglichen wird. Ist der Rest 0, ist der Zeitpunkt erreicht.
Es ist nur ein Sonderfall zu beachten: Wenn der Timestamp sich auf Minuten oder Stunden bezieht, kann der Ausdruck natuerlich im Moment der ausfuehrung wahr sein -- in Konsequenz wuerde nicht bis zum naechsten Wahr-Werden gewartet. Daher ist dieser Fall vorab zu pruefen.

Eine Anwendung findet waitmod bei mir mit dem Streamdumping streamrecording.html.
Der Quellcode down/waitmod.c.

Verbesserungsvorschlaege nehme ich gerne per Mail an ad001@uni-rostock.de entgegen.

Stichworte:


Impressum