Zeitbedingungsschleife in der Shell
Ich habe gerade angefangen zu lernen, shell-Skript, vor kurzem, also weiß ich nicht viel über Sie.
Ich bin auf der Suche Beispiel für Zeit-basierte while-Schleife, aber ohne Glück.
Möchte ich laufen eine Schleife für eine bestimmte Zeit, sagen wir mal 1 Stunde. Also loop läuft für eine Stunde und endet dann automatisch.
Edit: Diese Schleife läuft kontinuierlich ohne Schlaf, so dass die Schleife-Bedingung sollte auf loop-start-Zeit und der aktuellen Zeit, nicht auf den Schlaf.
InformationsquelleAutor der Frage Mihir | 2012-06-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der beste Weg, dies zu tun ist mit dem $SEKUNDEN-variable, die eine Zählung der Zeit, dass die Skripts (oder shell) ausgeführt wurde. Der unten Beispielcode zeigt, wie Sie eine while-Schleife für 3 Sekunden.
InformationsquelleAutor der Antwort bsravanin
VORBEHALT: Alle Lösungen, die in diese Antwort - mit Ausnahme der
ksh
- Rückkehr bis zu (aber nicht einschließlich) 1 Sekunde zu frühda Sie auf Basis einer ganzheitlichen-Sekunden-Zähler, die Fortschritte auf der Grundlage der real-time (system) Uhr eher als auf der Basis wenn der code Ausführung gestartet.bash
,ksh
zsh
- Lösung, bei der spezielle shell-variable$SECONDS
:Leicht vereinfachte version von @bsravanin Antwort.
Grob gesagt, ist
$SECONDS
enthält die Anzahl der Sekunden, die verstrichen, so weit in einem Skript.In
bash
undzsh
erhalten Sie integral Sekunden voran, indem Sie den Puls der - system (Echtzeit -) Uhr - d.h., zählen hinter den kulissen nicht wirklich, beginnen bei0
(!), aber was auch immer Fraktion, die seit dem letzten full-time-of-day-zweite das Skript zufällig gestartet werden, oder dieSECONDS
variable zurückgesetzt wurde.Dagegen
ksh
arbeitet wie man es erwarten würde: zählen wirklich beginnt bei0
beim zurücksetzen$SECONDS
; darüber hinaus$SECONDS
Berichte Bruch Sekunden inksh
.Daher die einzige shell, die diese Lösung funktioniert vernünftigerweise vorhersehbar und genau ist
ksh
. Das heißt, für grobe Messungen und timeouts kann es immer noch werden in nutzbarebash
undzsh
.Hinweis: im folgenden wird ein
bash
shebang Zeile; einfach ersetzenksh
oderzsh
fürbash
wird das Skript ausgeführt werden mit diesen Schalen auch.Lösung für POSIX-Funktionen-nur die Schalen, wie
sh
(dash
) auf Ubuntu ($SECONDS
ist nicht POSIX-konform)Gereinigt-up-version von @dcpomero Antwort.
Verwendet Epoche Zeit zurückgegeben, indem
date +%s
(verstrichenen Sekunden seit dem 1. Januar 1970) und POSIX-syntax für bedingte.VORBEHALT:
date +%s
selbst (insbesondere die%s
format) ist nicht POSIX-konform, aber es wird die Arbeit auf (mindestens), Linux, FreeBSD, und OSX.InformationsquelleAutor der Antwort mklement0
Können Sie versuchen, diese
wo
'date +%s'
gibt die aktuelle Uhrzeit in Sekunden.InformationsquelleAutor der Antwort Ashwini
date +%s
geben Sie die Sekunden seit der Epoche, also so etwas wieMüssen Sie möglicherweise einige änderungen vornehmen, da meine bash ist rostig
InformationsquelleAutor der Antwort dcpomero
Erkunden Sie die
-d
Möglichkeitdate
.Unten ist eine shell-script-snippet zu veranschaulichen. Es ist ähnlich zu anderen Antworten, aber sinnvoller sein, in unterschiedlichen Szenarien.
Können Sie rufen Sie dann das Skript in der viele verschiedene Wege, Datum versteht:
InformationsquelleAutor der Antwort Gindri
Können Sie die
loop
Befehl, zur Verfügung hieretwa so:Machen die Ihre Sache alle fünf Sekunden für eine Stunde.
InformationsquelleAutor der Antwort Rich Jones