当网络无法访问时,有什么方法可以启动(重复)ping?

Dan*_*etz 6 networking shell-script 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
...
Run Code Online (Sandbox Code Playgroud)

但是,如果运行 ping 时网络关闭:

me@here:~$ ping -n 8.8.8.8
connect: Network is unreachable
me@here:~$
Run Code Online (Sandbox Code Playgroud)

这与无法访问的网络问题相同,但 ping 不会继续尝试,直到网络再次启动,就像以前一样。

Nid*_*dal 7

您可以在 shell 脚本中使用 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"
Run Code Online (Sandbox Code Playgroud)

要停止打印connect: Network is unreachable消息,您可以使用 ping 编辑该行,如下所示:

ping -n 8.8.8.8 2> /dev/null
Run Code Online (Sandbox Code Playgroud)

或者您可以sleep在循环中添加一个以减少这些消息的数量。

脚本可以简化为

while ! ping -n 8.8.8.8
do
    sleep 1
done
Run Code Online (Sandbox Code Playgroud)

这让它可以写在一行中:

while ! ping -n 8.8.8.8; do sleep 1; done
Run Code Online (Sandbox Code Playgroud)