ネットワークが到達不能なときに(繰り返し)ping を開始する方法はありますか?

ネットワークが到達不能なときに(繰り返し)ping を開始する方法はありますか?

私のpingコマンド(Debian 6または7)は、ネットワークがダウンしている間でもサーバーにpingを繰り返し試行します。もし起動時にはネットワークは稼働していました。ネットワークがダウンしているときに ping を開始して、同じ動作を実現する方法はありますか?

次に例を示します。ネットワークが稼働しているときに繰り返し ping を開始し、ping の実行中にネットワークがダウンすると、ping は繰り返し続けられます。ネットワークが再び稼働すると、ping は継続されます。

me@here:~$ ping -n 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_req=1 ttl=46 time=117 ms
...
64 bytes from 8.8.8.8: icmp_req=6 ttl=46 time=116 ms
ping: sendmsg: Network is unreachable
...
ping: sendmsg: Network is unreachable
64 bytes from 8.8.8.8: icmp_req=108 ttl=46 time=694 ms
...

ただし、ping を実行したときにネットワークがダウンしている場合は、次のようになります。

me@here:~$ ping -n 8.8.8.8
connect: Network is unreachable
me@here:~$

これは同じ到達不能ネットワークの問題ですが、以前のようにネットワークが再び稼働するまで ping は試行を続けません。

答え1

シェル スクリプトでは while ループを使用できます。

failed=1 # any number not equal to zero
while [ $failed -ne 0 ]
do
   ping -n 8.8.8.8
   failed=$?
done
# after the  $? becomes "0" it will get out of the while loop
echo "ping succeeded"

メッセージの出力を停止するには、connect: Network is unreachable次のように ping の行を編集します。

ping -n 8.8.8.8 2> /dev/null

sleepまたは、ループ内にを追加して、それらのメッセージの数を減らすこともできます。

スクリプトは次のように簡略化できます。

while ! ping -n 8.8.8.8
do
    sleep 1
done

こうすると、1 行で記述できます。

while ! ping -n 8.8.8.8; do sleep 1; done

答え2

私の知る限り、pingインターフェースでソケットを開けない場合(インターフェースがダウンしているため)は実行されません。デバイスを で確認するとip link show、どのデバイスがまたは

まずネットワークデバイスをアクティブ化してみてください。

$ sudo ip link set <iface> up
$ ping -n 8.8.8.8

私はArch Linuxボックスでこれをテストしましたwifiインターフェース、および仮想イーサネット (IP アドレスが割り当てられていない) インターフェイス。ping前者の A は終了しますが、後者はping継続します。

それ以外の場合は、networker のシェル スクリプトを使用します。

答え3

の代わりに、およびオプションfpingとともにを使用できます。これには、インターフェースの名前を知っていて、root として実行する必要があります。-l-Iping

root@here:~# fping -l -I wlan0 -n 8.8.8.8

me@here:~$ sudo fping -l -I eth0 -n 8.8.8.8

関連情報