Answers:
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"
这有点circuit回,但是如果您希望循环可取消,则可以解决问题。
ping
将等待10秒钟,然后再放弃ping。如果要将其减少到1秒,可以使用-w1
。
-W1
您可以进行循环,发送一次ping,然后根据状态中断循环,例如(bash):
while true; do ping -c1 www.google.com > /dev/null && break; done
将其放置在脚本中的某个位置将阻止,直到www.google.com
可以ping通为止。
while true
并break
是清晰的解决方案,海事组织。
while true; do sleep 5; ping ...
我知道这个问题很旧...特别是关于的问题ping
,但我想分享我的解决方案。
在重新引导主机时,我会用它来知道何时可以再次通过SSH重新登录它们。(因为ping
它将在sshd
启动前响应几秒钟。)
until nc -vzw 2 $host 22; do sleep 2; done
对目标主机执行一次ping操作。检查ping是否成功(ping的返回值为零)。如果主机不存在,请再次ping通。
可以将以下代码保存为文件,并以主机名作为参数来调用,或者除去第一行和最后一行,并在现有脚本(waitForHost主机名)中用作函数。
如果ping不导致响应,则代码不会评估失败的原因,因此如果主机不存在,则永远循环。我的BSD手册列出了每个返回值的含义,而linux则没有,因此我想这可能不是可移植的,这就是为什么我忽略了它。
#!/bin/bash
PING=`which ping`
function waitForHost
{
if [ -n "$1" ];
then
waitForHost1 $1;
else
echo "waitForHost: Hostname argument expected"
fi
}
function waitForHost1
{
reachable=0;
while [ $reachable -eq 0 ];
do
$PING -q -c 1 $1
if [ "$?" -eq 0 ];
then
reachable=1
fi
done
sleep 5
}
waitForHost $1
请在stackoverflow上查看好的选项。这是bash中的示例,您将不得不遍历以下代码,直到返回成功的ping结果。
ping -c 1 -t 1 192.168.1.1;
if [ $? -eq 0 ]; then
echo "192.168.1.1 is up";
else
echo "ip is down";
fi
为了更好地处理BSD ping上的SIGINT。
HOST=google.com NO=1; while [ $NO -ne 0 ]; do ping -W1 -c1 $HOST &>/dev/null; NO=$?;echo "$(date) ($HOST) $NO" ; done; echo "$(date) ($HOST) reachable"
作为功能
ping_until(){
local NO=1
while [ $NO -ne 0 ]; do
ping -W1 -c1 $1 &>/dev/null; NO=$?
# Optionally block ICMP flooding
# sleep 1
echo "$(date) ($1) ($NO)"
done
}
我一直在使用以下功能。我喜欢它,因为我可以告诉它在一段时间后停止尝试:
#!/usr/bin/env bash
function networkup {
# Initialize number of attempts
reachable=$1
while [ $reachable -ne 0 ]; do
# Ping supplied host
ping -q -c 1 -W 1 "$2" > /dev/null 2>&1
# Check return code
if [ $? -eq 0 ]; then
# Success, we can exit with the right return code
echo 0
return
fi
# Network down, decrement counter and try again
let reachable-=1
# Sleep for one second
sleep 1
done
# Network down, number of attempts exhausted, quiting
echo 1
}
可以这样使用它来启动一些东西:
# Start-up a web browser, if network is up
if [ $(networkup 60 www.google.com) -eq 0 ]; then
firefox &
fi