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

Min*_*ark 64 timeout ping

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

因此,我的脚本为每个主机启动一个 ping:

ping -c 1 10.0.0.1
Run Code Online (Sandbox Code Playgroud)

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

所以我试过这个:

ping -c 1 -W 1 10.0.0.1
Run Code Online (Sandbox Code Playgroud)

但是每个离线主机等待一秒钟仍然太长。我试图将其设置为低于一秒,但它似乎根本没有考虑该参数:

ping -c 1 -W 0.1 10.0.0.1  # timeout option is ignored, apparently
Run Code Online (Sandbox Code Playgroud)

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

编辑

  • 操作系统是 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
Run Code Online (Sandbox Code Playgroud)

此命令最多需要 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
Run Code Online (Sandbox Code Playgroud)

在 Debian Lenny 上,安装很简单:

aptitude update
aptitude install fping
Run Code Online (Sandbox Code Playgroud)

小智 52

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

ping -i 0.2 www.google.com
Run Code Online (Sandbox Code Playgroud)

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

sudo ping -i 0.1 www.google.com
Run Code Online (Sandbox Code Playgroud)

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

  • 来自我的 +1。这是谷歌搜索“ping timeout”时的第一个结果,这正是我正在寻找的。 (6认同)
  • 这个答案是不正确的——它不会改变`ping`等待响应的时间——而是更快地发送连续的ping...... (6认同)
  • 如果主机死机,此解决方案将在大约 1 秒后打印其第一个有用的输出。正如@MarcelBurkhard 已经提到的那样,这绝对是错误的答案。 (2认同)
  • 此解决方案的问题在于,对于耗时超过 100 毫秒的 ping,-i 0.1 不会等待 100 毫秒,而是等待更长的时间,从而导致计时失效。 (2认同)

And*_*dyN 50

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

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


Jor*_*ell 27

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

timeout 0.2 ping -c1 fqdn || { do_work }
Run Code Online (Sandbox Code Playgroud)


pac*_*cey 16

我将使用 nmap 来完成这项任务。

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

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


小智 7

在 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
Run Code Online (Sandbox Code Playgroud)


The*_*tor 5

如果您的所有主机都在物理 LAN 上,您可能需要查看 arp ping 工具。它执行相同的操作,但使用第 2 层 arp 数据包来执行“ping”。您可以结合使用 arpping 和 icmp ping(或者实际上是 tcp ping)来收集失败原因。示例是 tcp 堆栈崩溃,虽然现在很少见,但我们可以发现机器 tcp 堆栈是否崩溃,因为机器不会响应 ping,但它会响应 arp(这是主机上的另一段代码) 。

结合使用 arpping、tcpping 和 icmp ping,您可以查明计算机上的服务是否已崩溃、tcp 堆栈是否已崩溃,或者计算机是否已完全锁定。如果您有托管以太网交换机,您可以获得物理链路数据,显示机器是否实际打开,或已物理拔出。我们遇到过这样的情况:机器(公共房间中的客户端)将被关闭,我们收集该数据并发送唤醒 LAN 数据包,以启动机器。:-)

无论您构建什么解决方案,如果您的网络繁忙,请考虑实施某种 QoS,以便您的监控数据包在网络上优先,由于网络拥塞而丢失测量数据包可能会发出错误警报。如果确实使用服务质量来监控数据包,那么您需要考虑收集有关网络利用率的数据。

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

祝你好运!


小智 5

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

@laszlo-valko /sf/ask/1425164121/解释说 ping 超时仅在确定 IP 地址后才开始。如果您使用 DNS 并且您的工作站处于离线状态,则 ping 无法确定 IP 地址,因此在返回 false 之前似乎会等待大约默认的 20 秒以上。

当使用域名运行 ping 时,使用 Linux“超时”工具可以提供更多控制。

多谢你们