我正在为一组实验室计算机编写局域网唤醒脚本。我们有一个带数据库主机名,IP和MAC列表的sqlite db,目前我用'-c1'对其进行ping操作,因此它不会无休止地运行-但即使这需要一些等待,还有一种更快的获取方法回答而不是ping?使用ping似乎会减慢脚本的速度,因为它需要ping答案才能继续。
非常感谢您的任何建议!
我正在为一组实验室计算机编写局域网唤醒脚本。我们有一个带数据库主机名,IP和MAC列表的sqlite db,目前我用'-c1'对其进行ping操作,因此它不会无休止地运行-但即使这需要一些等待,还有一种更快的获取方法回答而不是ping?使用ping似乎会减慢脚本的速度,因为它需要ping答案才能继续。
非常感谢您的任何建议!
Answers:
发送单个数据包并等待响应将是最快的方法之一,而ping是一种很好的方法。实际上,根据您的用例,我认为它太快了,因为它并不能真正告诉您系统是否在实际做任何有用的事情,仅仅是内核的网络子系统处于活动状态并已配置。
但是,假设这已经足够好,则可以进行一些改进。首先,您可以-W1
将ping超时减少到一秒钟。其次,您可以使脚本异步(在后台线程中)对不同的主机执行ping操作,并根据需要检查结果,而不必等待。
或者,您可以重新考虑该方法,并让远程系统在启动时以某种方式签入,如果系统没有签入,则可以认为它已关闭。
这就是fping的目的。http://fping.sourceforge.net/
您需要在以后解析输出,而不是依赖返回码,但是它比普通的ping快得多。
这仅适用于一台或两台计算机,但是如果将它们直接连接到负责检查其状态的计算机,则可以ethtool
用来查看链接是否处于活动状态。
ethtool {network_interface} | grep "Link detected" | cut -f 3 -d ' '
yes
如果连接了计算机,则返回,如果没有连接则返回no
。
您可以执行以下操作来ping广播地址,这将导致所有计算机ping通。然后,您可以对照SQLite中的内容交叉检查此列表,以确保所有计算机都已启动。
除此之外,ping可能是确保计算机在网络中苏醒的最快方法。正如另一个答案所提到的,这没有提供任何真正有用的数据。如果您具有安装脚本的能力,则可以添加cronjob来对中央服务器执行ping操作,运行任务或将进程列表回显到将记录请求的中央服务器。然后只需进行检查即可告诉您是否有任何问题,而无需每次手动检查。
我遇到了同样的问题,并提出了以下(快速且肮脏的)脚本。从本质上讲,这会将所有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
我发现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
而且grep
和sort
似乎只增加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
。