解決策 1:
マルティナスの答えをさらに単純化:
until ping -c1 www.google.com >/dev/null 2>&1; do :; done
ping 自体がループ テストとして使用されることに注意してください。成功するとすぐに、ループは終了します。ループ本体は空で、null コマンド ":
" 構文エラーを防ぐために使用されます。
更新:Control-C で ping ループをきれいに終了させる方法を考えました。これにより、バックグラウンドでループが実行され、割り込み (Control-C) シグナルがトラップされ、発生した場合はバックグラウンド ループが強制終了されます。
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"
少し遠回りですが、ループをキャンセル可能にしたい場合は、うまくいくはずです。
解決策 2:
私は質問が古いことを知っています...そして特に ping
に関して尋ねます 、しかし、私の解決策を共有したかった.
ホストを再起動するときにこれを使用して、いつホストに SSH で戻れるかを確認します。 (ping
以降 sshd
の数秒前に応答します が開始されます。)
until nc -vzw 2 $host 22; do sleep 2; done
解決策 3:
ループを実行し、1 つの ping を送信し、ステータスに応じてループを中断できます。たとえば (bash):
while true; do ping -c1 www.google.com > /dev/null && break; done
これをスクリプトのどこかに置くと、www.google.com
までブロックされます ping可能です。
解決策 4:
ターゲット ホストに 1 回 ping を実行します。 ping が成功したかどうかを確認します (ping の戻り値はゼロです)。ホストが稼働していない場合は、再度 ping を実行します。
次のコードは、ファイルとして保存してホスト名を引数として呼び出すか、最初と最後の行を削除して既存のスクリプト (waitForHost ホスト名) 内の関数として使用できます。
ping が応答しない場合、コードは失敗の原因を評価しないため、ホストが存在しない場合は永遠にループします。私の BSD マンページには各戻り値の意味が記載されていますが、Linux には記載されていません。
#!/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
解決策 5:
UNREACHEABLE=1;
while [ $UNREACHEABLE -ne "0" ];
do ping -q -c 1 HOST &> /dev/null; UNREACHEABLE=$?; sleep 1;
done
スリープ 1 を削除することができます。これは、ホストに到達可能であるが ping がコード 0 で終了しない場合のフラッディングの問題を防ぐためだけです。