比ping检查计算机是否在线的方法更快?


20

我正在为一组实验室计算机编写局域网唤醒脚本。我们有一个带数据库主机名,IP和MAC列表的sqlite db,目前我用'-c1'对其进行ping操作,因此它不会无休止地运行-但即使这需要一些等待,还有一种更快的获取方法回答而不是ping?使用ping似乎会减慢脚本的速度,因为它需要ping答案才能继续。

非常感谢您的任何建议!

Answers:


20

发送单个数据包并等待响应将是最快的方法之一,而ping是一种很好的方法。实际上,根据您的用例,我认为它太快了,因为它并不能真正告诉您系统是否在实际做任何有用的事情,仅仅是内核的网络子系统处于活动状态并已配置。

但是,假设这已经足够好,则可以进行一些改进。首先,您可以-W1将ping超时减少到一秒钟。其次,您可以使脚本异步(在后台线程中)对不同的主机执行ping操作,并根据需要检查结果,而不必等待。

或者,您可以重新考虑该方法,并让远程系统在启动时以某种方式签入,如果系统没有签入,则可以认为它已关闭。


很好地调用-w附加项,尽管由于一堆计算机的响应速度不够快,但必须使其变为两个。也许可以考虑添加某种定期签入或握手功能,但现在想让该过程相对于我要打开的计算机相对外部。
乔恩·菲诺

1
我还使用-s发送较小的数据包。
肖恩·高夫

3
如果发送较小的数据包会有所不同,我会感到震惊。
mattdm 2011年

它们不是已经以接近最小数据包的大小发送了吗?
乔恩·菲诺

4
它们很小。默认为56个数据字节,您可以减少该字节。但是无论如何,它比以太网MTU小,比什么都没有大,因此无论哪种方式,它都归结为“一个数据包”。
mattdm 2011年


3

这仅适用于一台或两台计算机,但是如果将它们直接连接到负责检查其状态的计算机,则可以ethtool用来查看链接是否处于活动状态。


我还没有使用ethtool,您想举个例子吗?(或链接)?
约翰

ethtool {network_interface} | grep "Link detected" | cut -f 3 -d ' 'yes如果连接了计算机,则返回,如果没有连接则返回no
LawrenceC'2

2

您可以执行以下操作来ping广播地址,这将导致所有计算机ping通。然后,您可以对照SQLite中的内容交叉检查此列表,以确保所有计算机都已启动。

除此之外,ping可能是确保计算机在网络中苏醒的最快方法。正如另一个答案所提到的,这没有提供任何真正有用的数据。如果您具有安装脚本的能力,则可以添加cronjob来对中央服务器执行ping操作,运行任务或将进程列表回显到将记录请求的中央服务器。然后只需进行检查即可告诉您是否有任何问题,而无需每次手动检查。


1
我假设您的意思是ping广播地址,而不是网关。在现代系统上,这可能行不通。参见unix.stackexchange.com/questions/7458/cant-ping-broadcast
mattdm 2011年

1
@mattdm:那么多播吗?我不知道大多数人都关闭了它。我以前没有遇到过问题。
乔什·K

哈哈,是的,谢谢mattdm,您可以看到我遇到的类似问题。不是人们将它们关闭,而是显然在最近它们通常随广播一起关闭。
乔恩·菲诺

可以使用fping(fping.sourceforge.net)并行ping主机列表。然后,您不必依靠能够ping广播地址。
mazianni 2011年

2

Ganglia使用多播流量来监视群集中的许多主机,也许您可​​以使用类似的方法?假设您的网络硬件允许所有主机和监视系统之间的多播通信。


1
看起来像一个很酷的工具,但是出于这个小脚本的目的,可能会在项目中添加一些不必要的块,现在将其作为一个很小的脚本保存。虽然一定会引起我的注意,但是看起来我可能很快就会使用它。
乔恩·菲诺

0

我遇到了同样的问题,并提出了以下(快速且肮脏的)脚本。从本质上讲,这会将所有ping并行发出为单独的作业,并且将在3秒内扫描整个/ 24子网;请注意,由于某种原因,我没有费心找出我无法在此处使用ping结果代码,但是grep -v做到了:

#!/bin/bash
case $# in
1)
  case $1 in
  [1-9]*)
        echo
        echo Systems active in subnet: $1
        for (( K = 1 ; K < 255 ; K=$K+1 )); do
        # grep -v delivers 0 on no matches
                echo -ne "testing:" $1$K "...    \r"
                (if ping -c 1 -w 1 -n $1$K 2>&1 | grep -q '64 bytes' ; then
                echo $1$K alive "                "
                fi) &
        done
        sleep 3
        echo "                               "
        exit 0
        ;;
  esac;;
esac

0

在C中

/* count = 1, wait interval = 1 second, no name lookup, */
/* 10 data bytes, 1 second timeout, 200 millisecond wait time */

sprintf(command,"ping -c1 -i1 -n -s10 -t1 -W200 %u" 
   , connection[port].IPAddress);
err = system(command);
/* err == 0 means OK */

0

我发现fping -r0 ...响应速度最快。

-r(重试)选项似乎更快,比同类-c(计数)。使用-r0结果仅发送一次ping,与其他选项相比,输出缩写很多。

在我的系统上...

fping -r0 PRINTER LX00 LX01 LX02 LX03 HA01  2>&1

结果是...

LX00 is alive
LX02 is alive
HA01 is alive
ICMP Host Unreachable from 192.168.1.5 for ICMP Echo sent to LX01
PRINTER is unreachable
LX01 is unreachable
LX03 is unreachable

稍微按摩一下即可摆脱ICMP消息,这给了我...

fping -r0 PRINTER LX00 LX01 LX02 LX03 HA01  2>&1 | grep ' is ' | sort

HA01 is alive
LX00 is alive
LX01 is unreachable
LX02 is alive
LX03 is unreachable
PRINTER is unreachable

至于速度,fping在这个具有4GB RAM的旧1.8GHz Intel双核处理器上,...

time fping -r0 PRINTER LX00 LX01 LX02 LX03 HA01 2>&1

LX00 is alive
LX02 is alive
HA01 is alive
PRINTER is unreachable
LX01 is unreachable
LX03 is unreachable

real    0m0.554s
user    0m0.000s
sys     0m0.000s

而且grepsort似乎只增加0.001-0.004s的时间...

time fping -r0 PRINTER LX00 LX01 LX02 LX03 HA01 2>&1 | grep ' is ' | sort

HA01 is alive
LX00 is alive
LX01 is unreachable
LX02 is alive
LX03 is unreachable
PRINTER is unreachable

real    0m0.558s
user    0m0.000s
sys     0m0.000s

笔记

  • ICMP消息并非在每次运行时都出现。
  • 2>&1防止是必要的ICMP,从消息 表示在输出了,因为它被发送到stderr的代替stdout
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.