Řešení 1:
Další zjednodušení Martynasovy odpovědi:
until ping -c1 www.google.com >/dev/null 2>&1; do :; done
všimněte si, že samotný ping se používá jako test smyčky; jakmile se to podaří, smyčka končí. Tělo smyčky je prázdné, obsahuje příkaz null ":
" slouží k zamezení syntaktické chyby.
Aktualizace:Přemýšlel jsem o způsobu, jak přimět Control-C opustit smyčku ping čistě. Toto spustí smyčku na pozadí, zachytí signál přerušení (Control-C) a ukončí smyčku na pozadí, pokud k ní dojde:
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"
Je to trochu zdlouhavé, ale pokud chcete, aby byla smyčka zrušitelná, mělo by to stačit.
Řešení 2:
Vím, že otázka je stará... a konkrétně se ptá na ping
, ale chtěl jsem se podělit o své řešení.
Používám to při restartování hostitelů, abych věděl, kdy se k nim mohu vrátit pomocí SSH. (Od ping
bude reagovat několik sekund před sshd
je spuštěno.)
until nc -vzw 2 $host 22; do sleep 2; done
Řešení 3:
Můžete udělat smyčku, poslat jeden ping a v závislosti na stavu přerušit smyčku, například (bash):
while true; do ping -c1 www.google.com > /dev/null && break; done
Umístění tohoto někam do skriptu bude blokovat, dokud www.google.com
je možné pingnout.
Řešení 4:
Proveďte jednou ping na cílového hostitele. Zkontrolujte, zda byl ping úspěšný (návratová hodnota pingu je nula). Pokud hostitel není naživu, ping znovu.
Následující kód lze uložit jako soubor a volat s názvem hostitele jako argumentem, nebo lze odstranit první a poslední řádek a použít jako funkci v rámci existujícího skriptu (waitForHost hostname).
Kód nevyhodnocuje příčinu selhání, pokud ping nevede k odpovědi, takže pokud hostitel neexistuje, bude se věčně opakovat. Moje BSD manuálová stránka uvádí význam každé návratové hodnoty, zatímco linuxová ne, takže si myslím, že to nemusí být přenosné, proto jsem to vynechal.
#!/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
Řešení 5:
UNREACHEABLE=1;
while [ $UNREACHEABLE -ne "0" ];
do ping -q -c 1 HOST &> /dev/null; UNREACHEABLE=$?; sleep 1;
done
Můžete odstranit režim spánku 1, je to zde pouze proto, aby se zabránilo jakémukoli problému zahlcení v případě, kdy by byl hostitel dosažitelný, ale ping by neukončil s kódem 0.