Lösung 1:
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, mit dem Nullbefehl „:
" verwendet, um einen Syntaxfehler zu verhindern.
Update:Ich dachte an eine Möglichkeit, Control-C dazu zu bringen, die Ping-Schleife sauber zu verlassen. Dadurch wird die Schleife im Hintergrund ausgeführt, das Interrupt-Signal (Control-C) abgefangen und die Hintergrundschleife beendet, wenn es 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 abgebrochen werden kann, sollte es den Zweck erfüllen.
Lösung 2:
Ich weiß, die Frage ist alt ... und fragt speziell nach ping
, aber ich wollte meine Lösung teilen.
Ich verwende dies beim Neustart von Hosts, um zu wissen, wann ich wieder per SSH wieder auf sie zugreifen kann. (Seit ping
antwortet einige Sekunden vor sshd
gestartet.)
until nc -vzw 2 $host 22; do sleep 2; done
Lösung 3:
Sie können eine Schleife machen, einen Ping senden und je nach Status die Schleife unterbrechen, zum Beispiel (bash):
while true; do ping -c1 www.google.com > /dev/null && break; done
Wenn Sie dies irgendwo in Ihr Skript einfügen, wird es blockiert, bis www.google.com
ist pingbar.
Lösung 4:
Pingen Sie den Zielhost einmal. Prüfen Sie, ob der Ping erfolgreich war (Rückgabewert von Ping ist Null). Wenn der Host nicht aktiv ist, pingen Sie erneut.
Der folgende Code kann als Datei gespeichert und mit dem Hostnamen als Argument aufgerufen werden oder die erste und letzte Zeile entfernen und als Funktion innerhalb eines bestehenden Skripts (waitForHost Hostname) verwendet werden.
Der Code wertet die Fehlerursache nicht aus, wenn der Ping nicht zu einer Antwort führt, wodurch eine Endlosschleife ausgeführt wird, wenn der Host nicht vorhanden ist. Meine BSD-Manpage listet die Bedeutung jedes Rückgabewerts auf, während die Linux-Manpage dies nicht tut, also schätze ich, dass dies nicht portierbar ist, deshalb habe ich es weggelassen.
#!/bin/bash
PING=`which ping`
function waitForHost
{
if [ -n "$1" ];
then
waitForHost1 $1;
else
echo "waitForHost: Hostname argument expected"
fi
}
function waitForHost1
{
reachable=0;
while [ $reachable -eq 0 ];
do
$PING -q -c 1 $1
if [ "$?" -eq 0 ];
then
reachable=1
fi
done
sleep 5
}
waitForHost $1
Lösung 5:
UNREACHEABLE=1;
while [ $UNREACHEABLE -ne "0" ];
do ping -q -c 1 HOST &> /dev/null; UNREACHEABLE=$?; sleep 1;
done
Sie können sleep 1 entfernen, es ist nur hier, um ein Flooding-Problem zu verhindern, falls der Host erreichbar wäre, aber Ping nicht mit Code 0 beendet würde.