Eine weitere Vereinfachung der Antwort von Martynas:
until ping -c1 www.google.com >/dev/null 2>&1; do :; done
Beachten Sie, dass Ping selbst als Schleifentest verwendet wird. Sobald es erfolgreich ist, endet die Schleife. Der Schleifenkörper ist leer, wobei der Befehl " :
" null verwendet wird, um einen Syntaxfehler zu verhindern.
Update: Ich habe mir überlegt, wie Control-C die Ping-Schleife sauber verlassen kann. Dadurch wird die Schleife im Hintergrund ausgeführt, das Interrupt-Signal (Control-C) abgefangen und die Hintergrundschleife beendet, falls dies auftritt:
ping_cancelled=false # Keep track of whether the loop was cancelled, or succeeded
until ping -c1 "$1" >/dev/null 2>&1; do :; done & # The "&" backgrounds it
trap "kill $!; ping_cancelled=true" SIGINT
wait $! # Wait for the loop to exit, one way or another
trap - SIGINT # Remove the trap, now we're done with it
echo "Done pinging, cancelled=$ping_cancelled"
Es ist ein bisschen umständlich, aber wenn Sie möchten, dass die Schleife stornierbar ist, sollte es den Trick tun.
ping
wird 10 Sekunden gewartet, bevor der Ping aufgegeben wird. Wenn Sie dies auf 1 Sekunde reduzieren möchten, können Sie verwenden-w1
.-W1
kill %1
es dann.Sie können eine Schleife erstellen, einen Ping senden und je nach Status die Schleife unterbrechen, zum Beispiel (bash):
Wenn Sie dies irgendwo in Ihr Skript
www.google.com
einfügen, wird dies blockiert, bis Ping möglich ist.quelle
while true
undbreak
die sauberere Lösung, IMO.while true; do sleep 5; ping ...
Ich weiß, die Frage ist alt ... und fragt speziell nach
ping
, aber ich wollte meine Lösung teilen.Ich benutze dies, wenn ich Hosts neu starte, um zu wissen, wann ich wieder in sie SSH kann. (Da
ping
wird für einige Sekunden reagiert, bevorsshd
gestartet wird.)quelle
Pingen Sie den Zielhost einmal. Überprüfen Sie, ob der Ping erfolgreich war (Rückgabewert von Ping ist Null). Wenn der Host nicht am Leben ist, pingen Sie erneut.
Der folgende Code kann als Datei gespeichert und mit dem Hostnamen als Argument aufgerufen oder von der ersten und letzten Zeile befreit und als Funktion in einem vorhandenen Skript (waitForHost-Hostname) verwendet werden.
Der Code wertet die Fehlerursache nicht aus, wenn der Ping nicht zu einer Antwort führt. Wenn der Host nicht vorhanden ist, wird eine Endlosschleife ausgeführt. Meine BSD-Manpage listet die Bedeutung der einzelnen Rückgabewerte auf, während die Linux-Manpage dies nicht tut. Deshalb habe ich sie weggelassen.
quelle
Sie können den Ruhezustand 1 entfernen. Er dient nur dazu, Überschwemmungsprobleme zu vermeiden, wenn der Host erreichbar ist, Ping jedoch nicht mit Code 0 beendet wird.
quelle
Bitte sehen Sie gute Optionen bei Stackoverflow . Hier ist ein Beispiel in Bash. Sie müssen den folgenden Code durchlaufen, bis ein erfolgreiches Ping-Ergebnis zurückgegeben wird.
quelle
Jede der obigen Schleifen kann auch mit fping anstelle von ping verwendet werden. IMO ist für die Verwendung in Skripten besser geeignet als Ping. Siehe fping (1) für Details.
Auch nützlich, um zu testen, ob die Maschinen in Betrieb sind, bevor Sie etwas an ihnen tun. Ein einfaches Beispiel:
quelle
Dies wird eine bestimmte Anzahl von Malen versuchen.
Anstatt zu wiederholen
$r
, können Sie es testen und entsprechend seinem Wert handeln:quelle
Um mit dem SIGINT auf BSD-Ping gut umzugehen.
als eine Funktion
quelle
Ich habe die folgende Funktion verwendet. Ich mag es, weil ich sagen kann, dass es nach einer Weile aufhören soll, es zu versuchen:
Es kann so benutzt werden, um etwas zu starten:
quelle
Im Allgemeinen möchte ich warten, bis meine Datenbank oder ein anderer Server hochgefahren ist, aber ich möchte nicht zu lange warten . Der folgende Code wartet 10 Sekunden und legt dann den Beendigungscode fest, wenn der Server nicht innerhalb des Zeitlimits angezeigt wurde.
Wenn der Server vor dem Zeitlimit angezeigt wird, wird die Schleife kurzgeschlossen, damit das nächste Codebit ausgeführt werden kann.
quelle
Eine weitere Verbesserung der Antwort von Gordon Davisson:
mit dem umgebenden '$ ()' wird eine Subshell gestartet und Sie können daher Control-C verwenden, um die Schleife zu beenden, falls der Host nicht verfügbar wird.
quelle