特定のアドレスにpingを送信し、見つかったらpingを停止する方法を教えてください。
私はそれをbashスクリプトで使用したいので、ホストが起動しているときにスクリプトはpingを続け、ホストが利用可能になった瞬間からスクリプトが続行します...
特定のアドレスにpingを送信し、見つかったらpingを停止する方法を教えてください。
私はそれをbashスクリプトで使用したいので、ホストが起動しているときにスクリプトはpingを続け、ホストが利用可能になった瞬間からスクリプトが続行します...
回答:
マルティナスの答えをさらに簡素化:
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"
少し遠回りですが、ループをキャンセルできるようにしたい場合は、トリックを行う必要があります。
ping
は、pingをあきらめる前に10秒待機します。これを1秒に減らしたい場合は、を使用できます-w1
。
-W1
kill %1
を強制終了します。
ループを実行し、1つのpingを送信し、ステータスに応じてループを中断できます。たとえば、(bash):
while true; do ping -c1 www.google.com > /dev/null && break; done
これをスクリプトのどこかに置くと、www.google.com
ping可能になるまでブロックされます。
while true
とbreak
IMO、クリーンなソリューションです。
while true; do sleep 5; ping ...
私は質問が古いことを知っています...そして、特にに関して尋ねますがping
、私は私の解決策を共有したかったです。
ホストを再起動するときにこれを使用して、再びSSHでホストに戻ることができるかどうかを確認します。(開始さping
れる前に数秒間応答しsshd
ます。)
until nc -vzw 2 $host 22; do sleep 2; done
ターゲットホストに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
stackoverflowで適切なオプションを参照してください。bashのサンプルを次に示します。成功したping結果が返されるまで、次のコードをループする必要があります。
ping -c 1 -t 1 192.168.1.1;
if [ $? -eq 0 ]; then
echo "192.168.1.1 is up";
else
echo "ip is down";
fi
これは、指定された回数試行します。
t=4; c=0; r=0; until ping -c 1 hostname.com >/dev/null 2>&1 || ((++c >= t)); do r=$?; done; echo $r
エコーする代わりに$r
、それをテストし、その値に従って動作することができます:
if ((r)); then echo 'Failed to contact host'; else echo 'Continuing with script'; fi
BSD pingでSIGINTを適切に処理するため。
HOST=google.com NO=1; while [ $NO -ne 0 ]; do ping -W1 -c1 $HOST &>/dev/null; NO=$?;echo "$(date) ($HOST) $NO" ; done; echo "$(date) ($HOST) reachable"
機能として
ping_until(){
local NO=1
while [ $NO -ne 0 ]; do
ping -W1 -c1 $1 &>/dev/null; NO=$?
# Optionally block ICMP flooding
# sleep 1
echo "$(date) ($1) ($NO)"
done
}
私は次の機能を使用しています。しばらくしてから試すのをやめるように指示できるので気に入っています。
#!/usr/bin/env bash
function networkup {
# Initialize number of attempts
reachable=$1
while [ $reachable -ne 0 ]; do
# Ping supplied host
ping -q -c 1 -W 1 "$2" > /dev/null 2>&1
# Check return code
if [ $? -eq 0 ]; then
# Success, we can exit with the right return code
echo 0
return
fi
# Network down, decrement counter and try again
let reachable-=1
# Sleep for one second
sleep 1
done
# Network down, number of attempts exhausted, quiting
echo 1
}
このように使用して何かを起動できます:
# Start-up a web browser, if network is up
if [ $(networkup 60 www.google.com) -eq 0 ]; then
firefox &
fi