ping +如何最小化ping命令的时间

时间:2014-03-25 19:03:41

标签: linux bash solaris ping

我想创建bash脚本,该脚本将通过ping的IP列表进行验证

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

Ping –c  1 126.78.6.23

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

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

所以检查150个IP我需要超过500秒

如果有一些好主意如何快速执行ping,请提供建议

  • 注意我的脚本需要在OS(linux和solaris)上运行

4 个答案:

答案 0 :(得分:4)

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

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

更新。在Solaris -c中有其他含义,因此对于您需要的solaris 另外运行ping

ping $ip 57 1

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

Solaris中的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;'

答案 1 :(得分:0)

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

答案 2 :(得分:0)

这些天Solaris是否附带coreutils OOTB?然后,您可以使用timeout指定上限:

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

答案 3 :(得分:0)

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

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

使用Solaris,发送单个ping的正确选项是

ping -s 126.78.6.23 64 1

安装nmap from sources会提供更强大的替代方案。