首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ping +如何最小化ping命令的时间

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

Stack Overflow用户
提问于 2014-03-25 19:03:41
回答 4查看 3K关注 0票数 2

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

问题是,对任何地址的ping都需要几秒钟(万一没有ping回答),尽管我将ping定义为:

代码语言:javascript
复制
Ping –c  1 126.78.6.23

上面的例子只执行了一次ping,但问题是时间问题,在ping结束之前等待几秒钟(如果没有答案)。

在我的例子中,这是至关重要的,因为我需要检查150多个IP(通常90%以上的IP没有存活)

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

如果有什么好主意如何快速执行ping,请提供建议。

  • 注意:我的脚本需要同时运行在操作系统( linux和solaris )上。
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-03-25 19:07:43

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

代码语言:javascript
复制
for ip in `< list`
do
   ( ping -c1 $ip || echo ip >> not-reachable ) &
done 

Update.Solaris -c中的有其他含义,因此对于Solaris,您需要以其他方式运行ping

代码语言:javascript
复制
ping $ip 57 1

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

Ping的Solaris语法:

代码语言:javascript
复制
/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]

您可以创建一个聚合这两个方法的函数:

代码语言:javascript
复制
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模块:

代码语言:javascript
复制
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;'
票数 4
EN

Stack Overflow用户

发布于 2014-03-25 22:43:47

现在Solaris是否使用coreutils OOTB?然后可以使用timeout指定上限:

代码语言:javascript
复制
timeout 0.2s ping -c 1 www.doesnot.exist >/dev/null 2>&1
票数 1
EN

Stack Overflow用户

发布于 2014-03-25 19:27:02

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22643988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档