gpt4 book ai didi

shell - Ping shell 脚本 : Some packet loss, 但错误代码 $?等于零。我怎样才能检测到?

转载 作者:行者123 更新时间:2023-12-02 17:39:42 27 4
gpt4 key购买 nike

有时我的 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解析输出,或者有一些更简单的方法吗?

最佳答案

根据man页,默认情况下(在 Linux 上),如果 ping 根本没有收到任何回复数据包,它将退出并显示代码 1。但是如果数据包计数 (-c) 和截止时间超时 (-w,秒)都被指定,并且超时之前收到的数据包较少,它也会以代码 1 退出。如果出现其他错误,它会以代码 2 退出。

ping 8.8.8.8 -I eth9 -c 3 -w 3

因此,如果3秒内未收到3个数据包,则会设置错误代码。

正如 @mklement0 所指出的,ping on BSD行为方式有点不同:

The ping utility exits with one of the following values:

0 - at least one response was heard from the specified host.

2 - the transmission was successful but no responses were received.

因此,在这种情况下,应该尝试通过循环发送一项来解决这个问题

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 循环后打印结果/设置错误代码(如果需要)。

关于shell - Ping shell 脚本 : Some packet loss, 但错误代码 $?等于零。我怎样才能检测到?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33977842/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com