由于 ICMP 主机不可达,Linux ping 命令提前退出

shu*_*ckc 5 linux ping icmp

一个自动化脚本shutdown -r now在一台机器上运行,在 30 秒的延迟后,使用 ping 来确定机器何时可用。我最近将操作系统从 Centos 5 切换到 Oracle Linux 6,发现 ping 的行为发生了变化。

我将 ping 与计数 (-c10)、截止日期 (-w360) 和延迟 (-W1) 一起使用,这应该最多等待五分钟才能收到来自机器的 10 次成功回复。

我观察到我自己的机器Destination Host Unreachable在 30 秒后生成消息,导致ping在 3 个错误后退出,即。远在我想要的截止日期之前。例如在 ~37 秒后退出的示例:

[cs@bst1 ~]# time ping -c10 -w360 -W1 hostother; echo $?
PING hostother (10.210.51.155) 56(84) bytes of data.
From bst1 (10.210.51.139) icmp_seq=36 Destination Host Unreachable
From bst1 (10.210.51.139) icmp_seq=37 Destination Host Unreachable
From bst1 (10.210.51.139) icmp_seq=38 Destination Host Unreachable

--- hostother ping statistics ---
38 packets transmitted, 0 received, +3 errors, 100% packet loss, time 37008ms
pipe 3

real    0m37.010s
user    0m0.001s
sys     0m0.000s
1
Run Code Online (Sandbox Code Playgroud)

这似乎与man ping

如果 ping 根本没有收到任何回复数据包,它将以代码 1 退出。 如果同时指定了数据包计数和截止时间,并且在截止时间到达时收到少于计数的数据包,它也会以代码 1 退出。在其他错误时,它以代码 2 退出。否则,它以代码 0 退出。这使得可以使用退出代码来查看主机是否处于活动状态。

1)面对ICMP错误时ping的行为是否与手册页一致?在错误情况下,返回码似乎应该是 2。

2)是否可以防止我自己的机器跳入这些Destination Host Unreachable消息?

如果我重新运行几次 ping,它最终会看到主机并干净地退出(返回代码 0)。

小智 4

我建议您将超时从 中渗透出来ping并使用该timeout命令(coreutils 的一部分):

timeout 300s bash -c "until ping -c10 hostother; do false; done"
Run Code Online (Sandbox Code Playgroud)

如果命令超时,您将得到124作为返回码;例如,如果在 5 分钟内连续 10 次 ping 均未成功,则一旦成功则为0 。ping

我知道这并不能真正回答问题(我承认ping手册页不是很清楚),但希望能解决您眼前的问题。