如何使用ping命令设置短暂超时?

我正在编写一个脚本,列出我局域网上的所有主机(其中大约有20个主机),并在每个主机旁边写入ping状态。 我有DHCP租约文件,所以我有所有的IP(比如10.0.0.1,10.0.0.2等),我需要的只是每个主机的ping状态。

所以,我的脚本为每个主机启动一个ping:

ping -c 1 10.0.0.1 

不幸的是,当主机离线时,ping需要很长时间才能超时。 我检查了man ping ,似乎有两个选项来设置超时延迟: -w deadline-W timeout 。 我想我对后者感兴趣。

所以我试过这个:

 ping -c 1 -W 1 10.0.0.1 

但每个离线主机等待一秒钟仍然太长。 我试图把它设置在一秒以下,但似乎并没有考虑到这个参数:

 ping -c 1 -W 0.1 10.0.0.1 # timeout option is ignored, apparently 

有没有办法将超时设置为较低的值? 如果没有,有没有其他的select?

编辑

  • 操作系统是Debian Lenny。
  • 我想要ping的主机实际上是接入点。 它们与用户在同一个vlan和子网上(为了简化部署和replace)。 这就是为什么我不想扫描所有的子网(例如ping -b )。

编辑#2

我接受了fping解决scheme(感谢所有其他答案)。 这个命令正是我正在寻找的东西:

 fping -c1 -t500 10.0.0.1 10.0.0.2 10.0.0.3 10.0.0.4 

这个命令最多需要500ms才能完成,并且一次给我所有主机的ping状态:

 10.0.0.1 : [0], 84 bytes, 5.71 ms (5.71 avg, 0% loss) 10.0.0.2 : [0], 84 bytes, 7.95 ms (7.95 avg, 0% loss) 10.0.0.3 : [0], 84 bytes, 16.1 ms (16.1 avg, 0% loss) 10.0.0.4 : [0], 84 bytes, 48.0 ms (48.0 avg, 0% loss) 10.0.0.1 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 5.71/5.71/5.71 10.0.0.2 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 7.95/7.95/7.95 10.0.0.3 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 16.1/16.1/16.1 10.0.0.4 : xmt/rcv/%loss = 1/1/0%, min/avg/max = 48.0/48.0/48.0 

在Debian Lenny上,安装是微不足道的:

 aptitude update aptitude install fping 

fping可能是比你使用的股票更好的工具。 你在什么操作系统?

  • “fping不同于ping,因为您可以在命令行上指定任意数量的目标,或者指定一个包含要ping的目标列表的文件。”
  • “而不是发送到一个目标,直到超时或回复,fping将发出一个ping包,并以循环方式移动到下一个目标。
  • “与ping不同的是,fping是为了在脚本中使用,所以它的输出被devise为易于parsing。”

对于寻找涉及ping的解决scheme的人,请使用-i开关。

 ping -i 0.2 www.google.com 

或者,如果你想使用0.1,你需要以root身份运行它

 sudo ping -i 0.1 www.google.com 

无需下载额外的实用程序。

我会为此任务使用nmap。

nmap -sP --max-retries=1 --host-timeout=1500ms 10.0.0.1

有关详细信息,请参阅nmap文档 。

您可以在Ubuntu / Debian上使用timeout命令设置一个短暂的超时timeout

 timeout 0.2 ping -c1 fqdn || { do_work } 

如果你所有的主机都在物理的LAN上,你可能想要看看arp ping工具。它做同样的事情,但是使用第2层ARP包来做'ping'。 您可以使用arpping和icmp ping(或实际上是tcp ping)的组合来收集故障。 EXample是一个tcp堆栈崩溃,虽然现在很less见,但是我们可以发现机器tcp堆栈是否已经崩溃,因为机器不会响应ping,但是它会响应arp(这是主机上不同的一段代码) 。

使用arpping,tcpping和icmp ping的组合可以发现机器上的服务是否崩溃,tcp堆栈已经崩溃,或者机器已经完全locking。 如果您已经pipe理以太网交换机,则可以获取物理链路数据,从而显示机器是否实际打开,或者是否已经物理拔出。 我们有一种情况,机器(客户在公共场所)将被closures,我们收集了这些数据,并发送唤醒的LAN包,以启动机器。 🙂

你build立的解决scheme,如果你的networking繁忙,考虑实施某种qos,以便你的监控包优先在networking上,丢失由于networking拥塞造成的测量包会给出错误警报。 如果使用qos来监视数据包,则需要考虑收集有关networking利用率的数据。

因此,您可以使您的监控解决scheme尽可能地复杂或简单。 我们发现,即使是最基本的监控系统也是朝着正确的方向迈进的一步,至less有一些pipe理员在关注机器:-)。

祝你好运!

@ jordon-bedwell有一个很好的build议。

@ laszlo-valko https://stackoverflow.com/questions/20359487/why-does-ping-not-timeout-in-linux解释了ping超时只在IP地址确定后才开始。 如果您使用dns,而您的工作站处于脱机状态,则ping无法确定IP地址,因此在返回false之前似乎等待大约默认20 +秒。

使用linux'超时'工具提供了更多的控制与域名运行ping时。

多谢你们

如果您可以在不触发安全警报的情况下扫描您的子网(或其中的一部分),并且不介意一点额外的数据,那么“ 愤怒的IP扫描仪”可以快速,免费,让您点击按照状态sorting,并且可以提供更详细的信息。

在Windows和Debian上使用-w开关。

这是检查机器是否响应的一种快速方法,假定它会在小于指定的秒数的时间内响应。

 ping -w 1 192.168.80.105 PING 192.168.80.105 (192.168.80.105) 56(84) bytes of data. --- 192.168.80.105 ping statistics --- 2 packets transmitted, 0 received, 100% packet loss, time 999ms 

为什么不在后台启动ping,输出到临时文件,并行为每个主机? 然后睡一秒钟,杀掉仍在运行的ping进程,然后读取这些文件以收集输出。

超时值是一个整数值,指示可以发送数据包的时间和长度。 低于1的值是没有意义的。 值为1表示您只能ping直接邻居。

加快速度的唯一方法是进行背景调查并收获结果。 这就是像Nagios这样的工具。

你可以尝试这样的事情。 但需要15分钟才能运行。

 a=258 while [ $a -ge 1 ] do echo "10.0.0.$a" sudo ping -i 0.1 -c 1 "10.0.0.$a">>/home/$USER/output.log a=`expr $a - 1` done cat /home/$USER/output.log|grep -i "icmp_req=1" cat /dev/null>/home/$USER/output.log 

尝试这个:

 ping -n 5 1.2.3.4.5 >nul 

ping有[-t timeout]和[-W waittime]选项,所以你可以这样做:

 ping -c 1 -t 1 -W 1 google.com