如何最小化Ping命令的使用时间



我想创建bash脚本,它将通过ping IP列表来验证

问题是ping到任何地址都需要几秒钟(如果没有ping应答),尽管我定义了ping如下:

Ping –c  1 126.78.6.23

上面的例子只执行ping一次-但问题是时间,等待几秒钟直到ping结束(如果没有回答)

在我的情况下,这是至关重要的,因为我需要检查超过150个IP(通常超过90%的IP是不活跃的)

检查150个IP需要超过500秒

如果有什么好的建议如何执行ping快速

  • 注释我的脚本需要在两个操作系统(linux和solaris)上运行

最好的方法是并行运行ping然后将结果保存在一个文件中。在这种情况下,您的脚本将运行不超过一秒钟。

for ip in `< list`
do
   ( ping -c1 $ip || echo ip >> not-reachable ) &
done 

更新。在Solaris中,-c具有其他含义,因此对于Solaris,您需要以其他方式运行ping:

ping $ip 57 1

(这里,57是数据包的大小,1是要发送的数据包的数量)。

Ping的语法:

/usr/sbin/ping -s [-l | -U] [-adlLnrRv] [-A addr_family]
  [-c traffic_class] [-g gateway [ -g gateway...]]
  [-F flow_label] [-I interval] [-i interface] [-P tos]
  [-p port] [-t ttl] host [data_size] [npackets]

你可以创建一个函数来聚合这两个方法:

myping()
{
   [ `uname` = Linux ] && ping -c 1 "$i" || ping "$ip" 57 1
}
for ip in `< list`
do
   ( myping $ip || echo ip >> not-reachable ) &
done 

另一种选择,不直接使用ping,而是使用某些语言的ICMP模块。例如,您可以在Perl中使用Perl + Net::Ping模块:

perl -e 'use Net::Ping; $timeout=0.5; $p=Net::Ping->new("icmp", $timeout) or die bye ; print "$host is alive n" if $p->ping($host); $p->close;'

这些天Solaris和coreutils OOTB一起发布了吗?然后可以使用timeout指定上限:

timeout 0.2s ping -c 1 www.doesnot.exist >/dev/null 2>&1

您可以使用hping3,它是可脚本化的(在Tcl中)。

如前所述,克服时间问题的一个简单方法是并行运行ping命令。

您已经有了Linux (iputils) ping的语法。

对于Solaris,发送单个ping的正确选项是

ping -s 126.78.6.23 64 1

从源代码安装nmap将提供一个更强大的选择。

最新更新