如何在linux上ping主机直到知道?

我怎么能ping一个特定的地址,发现时,停止ping。

我想在一个bash脚本中使用它,所以当主机启动时,脚本不断ping,从主机可用的那一刻起,脚本继续…

Martynas的回答进一步简化:

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

注意ping本身被用作循环testing; 一旦成功,循环结束。 循环体是空的,空命令“ : ”用于防止语法错误。

你可以做一个循环,发送一个ping,并根据状态打破循环,例如(bash):

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

把它放在脚本的某个地方会阻塞,直到www.google.com是可以ping通的。

我知道这个问题是旧的…并具体询问有关ping ,但我想分享我的解决scheme。

我在重新启动主机时使用它来知道什么时候可以再次连接SSH。 (由于ping会在sshd启动之前响应几秒钟。)

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

平台目标主机一次。 检查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 
 UNREACHEABLE=1; while [ $UNREACHEABLE -ne "0" ]; do ping -q -c 1 HOST &> /dev/null; UNREACHEABLE=$?; sleep 1; done 

你可以删除睡眠1,只有在这里防止任何洪水问题的情况下,主机可以重新启动,但ping不会退出代码0。

请在stackoverflow看到很好的select。 这里是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
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 

上述任何一个循环都可以和fping一起使用,而不是ping,IMO比Ping更适合在脚本中使用。 有关详细信息,请参阅fping(1) 。

 while ! fping -q $HOSTNAMES ; do :; done 

在testing机器是否启动之前也是有用的。 一个简单的例子:

在HOST1 HOST2 HOST3中为h; 做
  如果fping -q $ h; 然后
     回声-n“$ h:”
      ssh $ h“uname -a”
  科幻
 DONE

这将尝试给定的次数。

 t=4; c=0; r=0; until ping -c 1 hostname.com >/dev/null 2>&1 || ((++c >= t)); do r=$?; done; echo $r 

您可以testing它并根据它的值执行操作,而不是回显$r

 if ((r)); then echo 'Failed to contact host'; else echo 'Continuing with script'; 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" 

作为一个function

 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 } 

我一直在使用以下function。 我喜欢它,因为我可以告诉它在一段时间后停止尝试:

 #!/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 

一般来说,我想等待我的数据库或其他服务器来,但我不想等太久 。 下面的代码等待10秒,然后设置退出代码,如果服务器没有出现在时间限制内。

如果服务器在时间限制之前出现,则循环将被短路,以便下一位代码可以运行。

 for i in `seq 1 10`; do date ; sleep 1 ; ping -c1 ${HOST} &>/dev/null && break ; done 

戈登·戴维森的回答进一步提高:

 until $(ping -c1 www.google.com &>/dev/null); do :; done 

与周围的'$()'一个子shell被启动,因此你可以使用Control-C在主机不可用的情况下终止循环。