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


49

我正在尝试编写一个脚本,该脚本列出局域网中的所有主机(其中约有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

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

编辑

  • 操作系统是Debian Lenny。
  • 我尝试ping的主机实际上是访问点。它们与用户位于同一VLAN和子网上(为简化部署和替换)。这就是为什么我不想扫描所有子网(ping -b例如用)的原因。

编辑#2

我接受了fping解决方案(感谢所有其他答案)。这个命令正是我想要的:

fping -c1 -t500 10.0.0.1 10.0.0.2 10.0.0.3 10.0.0.4

此命令最多需要500毫秒才能完成,并立即为我提供所有主机的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

Answers:


41

与您使用的库存ping相比,fping可能是更好的工具。您在什么操作系统上?

  • “ fping与ping的不同之处在于,您可以在命令行上指定任意数量的目标,或者指定包含要ping的目标列表的文件。”
  • “ fping不会发送到一个目标,直到它超时或答复为止,它会发送ping数据包并以循环方式移至下一个目标。”
  • “与ping不同,fping是要在脚本中使用的,因此其输出旨在易于解析。”

1
效果很好,谢谢,这就是我想要的。这个命令可以很好地完成工作:fping -c1 -t500 10.0.0.1 10.0.0.2 10.0.0.3 ...整个过程持续了半秒钟,我立即获得了所有主机的结果。优秀的工具。:
MiniQuark 2010年

37

对于正在寻找涉及解决方案的人们ping,请使用-i开关。

ping -i 0.2 www.google.com

或者,如果要使用0.1,则需要以root用户身份运行

sudo ping -i 0.1 www.google.com

无需下载其他实用程序。


4
向我+1。这是谷歌搜索“ ping超时”时的第一个结果,而这正是我想要的。
史蒂芬·杰弗里斯

@StevenJeffries同样在这里!
卢克

1
如果主机死机,此解决方案将在大约1秒钟后打印其第一个有用的输出。正如@MarcelBurkhard已经提到的,这绝对是错误的答案。
维克多·亚雷玛

1
此解决方案的问题在于-i 0.1不会等待100毫秒,而是等待更长的时间,因为ping花费的时间超过100毫秒,因此会浪费时间。
Llamageddon'3

2
这个答案是不正确-它不会改变多久ping会等待响应-而它只是发出连续的ping快....
物料间接开发

21

您可以timeout在Ubuntu / Debian上使用以下命令设置短暂超时:

timeout 0.2 ping -c1 fqdn || { do_work }

好答案!我现在做了:超时1 ping -c 1 test.com
vrijdenker '16

1
我的超时版本仅接受1秒。timeout (GNU coreutils) 8.4
slm 2016年

我喜欢这种解决方案,它可以应用于所有其他命令
daddinhquoc

@slm,奇怪的是您的版本支持的时间不到一秒钟。它为我:DURATION is a floating point number with an optional suffix: 's' for seconds (the default),......在我的情况man timeout报告GNU coreutils 8.26。BWT,我正在使用Ubuntu 17.04。
维克多·亚雷玛

实际上,这是唯一可行的方法,如果您想减少超时(主机不响应)...则必须进行数学计算:超时必须大于ping命令的“ -c” *“ -i”-
Marki

13

我将为此任务使用nmap。

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

有关更多详细信息,请参见nmap文档


好电话..这是做到这一点的“很棒”方式:D +1
Arenstar 2010年

嗨,我刚刚尝试了此操作,但是收到了以下错误消息:“-除非指定了通过附加's','m','h'或'd'来限定的主机超时时间,否则以毫秒为单位。必须大于1500毫秒”。
MiniQuark 2010年

我认为问题很明显,超时时间不能短于1500ms。我认为,比起您应该寻找具有并行性的nmap选项。
步履蹒跚,2010年

这似乎只发送一个请求。我正在寻找连续的故障检测,是通过谷歌搜索“ ping毫秒超时”到达的,nmap是否提供像ubuntu ping一样的infinie-ping?
ThorSummoner 2014年

将超时设置为小于一秒的时间将涉及使用特权用户,如@ victor-bjelkholm答案
thrau

4

如果所有主机都在物理LAN上,则可能需要使用arp ping工具。它执行相同的操作,但使用第2层arp数据包执行``ping''操作。您可以结合使用arpping和icmp ping或实际上是tcp ping来收集故障所在。EXample是一个tcp堆栈崩溃,尽管这几天很少发生,但我们可以发现一台计算机的tcp堆栈是否崩溃了,因为该计算机不会响应ping,但是会响应arp(这是主机上的另一段代码) 。

通过结合使用arpping,tcpping和icmp ping,您可以了解计算机上的服务是否已崩溃,tcp堆栈已崩溃或计算机已完全锁定。如果您具有托管的以太网交换机,则可以获取物理链接数据,以显示计算机是否已真正打开或已物理拔出。我们遇到了一种情况,即将关闭机器(公共房间中的客户端),我们收集数据并通过局域网数据包发送唤醒信息,以启动机器。:-)

如果您的网络繁忙,无论构建哪种解决方案,都可以考虑实施某种qos,以使监视数据包在网络上具有优先权,由于网络拥塞而丢失测量数据包会产生错误警报。如果确实使用qos监视数据包,那么您将需要考虑收集有关网络利用率的数据。

因此,您可以根据需要使监视解决方案变得复杂或简单。我们发现,即使最基本的监视系统也是朝着正确方向迈出的一步,至少有些管理员在关注机器:-)。

祝好运!


3

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

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

当使用域名运行ping时,使用linux'timeout'工具可提供更多控制。

多谢你们


2

在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

1

如果您可以在不触发安全警报的情况下扫描子网(或子网的一部分),并且不介意额外的数据,那么愤怒的IP扫描程序将快速,免费,允许您单击按状态排序并提供更多详细信息。


0

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


1
我想它会起作用,但是我正在寻找一个更简单的解决方案。不管怎么说,还是要谢谢你。
MiniQuark 2010年

此方法无法扩展。
Synetech '16

0

超时是一个整数值,指示可以发送数据包的距离和长度。小于1的值是没有意义的。值1表示您仅ping邻居。

加快处理速度的唯一方法是运行背景检查并收集结果。这就是像Nagios这样的工具。


1
对不起,但我真的不认为这是真的。手册页非常清楚,-W指定“等待响应的时间,以秒为单位”;它不是无量纲的,尽管ping不能接受低于1的值(因此是问题),亚秒级的超时也不是没有意义的。如果您会原谅我,您可能会将-W与-t混淆,后者将设置IP TTL(跳数)字段,该字段的作用与您描述的相同,而小于1的值的确没有意义。
MadHatter

-W是ping进程等待响应的时间,当跳数很高时(通常是这样),可以将其设置为远低于跳数。到三秒钟时,您通常会进入重试条件。某些工具可能允许使用更细粒度的计时器进行等待,但对于ping的大多数使用,秒是合理的单位。
BillThor

0

您可以尝试这样的事情。但是运行需要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

看起来nmap将是完成这项工作的正确工具。
kasperd 2015年

0

尝试这个:

ping -n 5 1.2.3.4.5 >nul

有什么比这更好的fping呢?
小鸡

-1

ping具有[-t超时]和[-W等待时间]选项,因此您可以执行以下操作:

ping -c 1 -t 1 -W 1 google.com
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.