如何在 Linux 中 ping 直到知道主机?

如何在 Linux 中 ping 直到知道主机?

我如何才能 ping 某个地址,并在找到后停止 ping。

我想在 bash 脚本中使用它,因此当主机启动时,脚本会继续 ping 并且从主机可用的那一刻起,脚本就会继续运行......

答案1

Martynas 的答案进一步简化:

until ping -c1 www.google.com >/dev/null 2>&1; do :; done

请注意,ping 本身用作循环测试;一旦成功,循环就结束。循环体为空,使用空命令“ :”来防止语法错误。

更新:我想到了一种让 Control-C 干净地退出 ping 循环的方法。这将在后台运行循环,捕获中断(Control-C)信号,并在发生中断时终止后台循环:

ping_cancelled=false    # Keep track of whether the loop was cancelled, or succeeded
until ping -c1 "$1" >/dev/null 2>&1; do :; done &    # The "&" backgrounds it
trap "kill $!; ping_cancelled=true" SIGINT
wait $!          # Wait for the loop to exit, one way or another
trap - SIGINT    # Remove the trap, now we're done with it
echo "Done pinging, cancelled=$ping_cancelled"

这有点迂回,但是如果你想要取消循环的话,它应该可以解决问题。

答案2

我知道这个问题已经很老了……并且具体询问有关ping,但我想分享我的解决方案。

我在重新启动主机时使用它来了解何时可以再次通过 SSH 连接到它们。(因为在启动ping之前会响应几秒钟。)sshd

until nc -vzw 2 $host 22; do sleep 2; done

答案3

您可以执行一个循环,发送一个 ping 并根据状态中断循环,例如 (bash):

while true; do ping -c1 www.google.com > /dev/null && break; done

将其放在脚本的某个位置将会被阻止,直到www.google.com可以 ping 通为止。

答案4

UNREACHEABLE=1;
while [ $UNREACHEABLE -ne "0" ]; 
   do ping -q -c 1 HOST &> /dev/null; UNREACHEABLE=$?; sleep 1;
done

您可以删除 sleep 1,它的作用仅仅是防止在主机可访问但 ping 不会以代码 0 退出的情况下出现任何洪水问题。

相关内容