4

時々、私の DSL ルーターはこの奇妙な方法で失敗します:

luis@balanceador:~$ sudo ping 8.8.8.8 -I eth9
[sudo] password for luis:
PING 8.8.8.8 (8.8.8.8) from 192.168.3.100 eth9: 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=47 time=69.3 ms
ping: sendmsg: Operation not permitted
64 bytes from 8.8.8.8: icmp_seq=3 ttl=47 time=68.0 ms
ping: sendmsg: Operation not permitted
64 bytes from 8.8.8.8: icmp_seq=5 ttl=47 time=68.9 ms
64 bytes from 8.8.8.8: icmp_seq=6 ttl=47 time=67.2 ms
ping: sendmsg: Operation not permitted
64 bytes from 8.8.8.8: icmp_seq=8 ttl=47 time=67.2 ms
^C
--- 8.8.8.8 ping statistics ---
8 packets transmitted, 5 received, 37% packet loss, time 7012ms
rtt min/avg/max/mdev = 67.254/68.183/69.391/0.906 ms
luis@balanceador:~$ echo $?
0

ご覧のとおり、エラー コード$?0. そのため、コマンドが失敗したかどうかを単純に検出することはできません。出力はどのスクリプトでもエラーを生成しないためです。

パケット損失があったことを検出する適切な方法は何ですか? 出力を解析
する 必要がありますか、それとももっと簡単な方法がありますか?grep

4

1 に答える 1

4

manページによると、デフォルト (Linux 上) では、ping が応答パケットをまったく受信しない場合、コード 1 で終了します。両方が指定されていて、タイムアウト前の受信パケット数が少ない場合も、コード 1 で終了します。その他のエラーでは、コード 2 で終了します。

ping 8.8.8.8 -I eth9 -c 3 -w 3

したがって、3 秒以内に 3 つのパケットが受信されない場合、エラー コードが設定されます。

@ mklement0 が指摘したように、 BSD での pingは少し異なる方法で動作します。

ping ユーティリティは、次のいずれかの値で終了します。

0 - 指定されたホストから少なくとも 1 つの応答が聞こえました。

2 - 送信は成功しましたが、応答がありませんでした。

したがって、この場合、ループで 1 つずつ送信して回避策を試す必要があります。

ip=8.8.8.8
count=3
for i in $(seq ${count}); do
   ping ${ip} -I eth9 -c 1
   if [ $? -eq 2 ]; then
      ## break and retransmit exit code
      exit 2
   fi
done

もちろん、完全な統計が必要な場合は、コード「2」と「0」をいくつかの変数にカウントし、必要に応じて forループの後に結果を出力/エラー コードを設定します。

于 2015-11-29T00:13:10.920 に答える