Ich benötige eine Reihe von Befehlen oder einen einzelnen Befehl, der bis zum nächsten Auftreten einer bestimmten Zeit wie "4:00" in den Ruhezustand versetzt wird.
Wie würde ich das machen?
Der at
Befehl oder ein Cronjob ist keine Option, da ich das Skript, in dem ich mich gerade befinde, nicht verlassen darf.
Der spezielle Fall, über den ich spreche, ist ein Skript, das auf dem Bildschirm ausgeführt wird. Es ist sehr wichtig, dass ich die Ausführung des Skripts durch das Skript selbst nicht stoppe, da dort viele wichtige Variablen gespeichert sind, die an einem bestimmten Punkt des Skripts benötigt werden. Das Skript sollte nicht immer regelmäßig ausgeführt werden. Es muss nur zu einem bestimmten Zeitpunkt ausgeführt werden.
Es wäre sehr nützlich, wenn das Skript Dateien oder andere Aufgaben wie Cronjobs oder andere Bildschirme erstellen müsste. Dies ist einfach eine Frage des Designs.
Ich hatte gerade eine tolle Idee:
difference=$(($(date -d "4:00" +%s) - $(date +%s)))
if [ $difference -lt 0 ]
then
sleep $((86400 + difference))
else
sleep $difference
fi
Hast du bessere Ideen?
Weitere Informationen werden auf Anfrage hinzugefügt!
date -d
mitdate -j
und ersetzen4:00
mit0400
.Antworten:
Terdons Vorschlag würde funktionieren, aber ich denke, meiner ist effizienter.
Dies berechnet die Differenz zwischen der angegebenen Zeit und der aktuellen Zeit in Sekunden. Wenn die Zahl negativ ist, müssen wir die Sekunden für einen ganzen Tag addieren (um genau zu sein 86400), um die Sekunden zu erhalten, die wir schlafen müssen, und wenn die Zahl positiv ist, können wir sie einfach verwenden.
quelle
Angenommen, es handelt sich um ein Shell-Skript, sollte dies funktionieren:
Das ist für 24 Stunden. Wenn Sie möchten, dass dies sowohl um 4:00 Uhr als auch um 16:00 Uhr fortgesetzt wird, verwenden Sie stattdessen Folgendes:
quelle
Unter OpenBSD kann Folgendes verwendet werden, um einen
*/5
5-Minuten-crontab(5)
Job in einen00
Stundenjob zu komprimieren (um sicherzustellen, dass weniger E-Mails generiert werden, während alle Aufgaben in genauen Intervallen ausgeführt werden):Beachten Sie, dass
date(1)
dies auchsleep(1)
bei der endgültigen Iteration das Design beeinträchtigen würde, da60
Minuten keine gültige Zeit sind (es sei denn!), Sodass wir keine zusätzliche Zeit warten müssen, bevor wir unseren E-Mail-Bericht erhalten.Beachten Sie auch, dass, sollte eine der Iterationen länger als 5 Minuten dauern, die Iteration
sleep
ebenfalls gnädig ausfallen würde, wenn sie überhaupt nicht schläft (aufgrund einer negativen Zahl, die als Befehlszeilenoption interpretiert wird, anstatt sich um sie zu wickeln) die nächste Stunde oder sogar die Ewigkeit), um sicherzustellen, dass Ihr Job noch innerhalb der zugewiesenen Stunde abgeschlossen werden kann (z. B. wenn nur eine der Iterationen etwas länger als 5 Minuten dauert, hätten wir immer noch die Zeit, ohne aufzuholen alles, was sich bis zur nächsten Stunde dreht).Dies
printf(1)
wird benötigt, dadate
für die Minutenangabe genau zwei Ziffern erwartet werden.quelle