我如何才能 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 退出的情况下出现任何洪水问题。