2017-09-03 57 views
0

我在这里和周围看了一下,似乎只提出了一个关于BASH环境中ping多线程的问题。BASH脚本中的多线程ping

代码

data=$(<~/Desktop/hosts.txt) 
    for line in $data 
    do 
     ping -c1 $line &> /dev/null & 
     echo $line is reachable || 
     echo $line is down 
    done 

的问题是,当实际上只有3个的/ 24是到达其循环通过文件,并报告所有的IP内的IP地址范围的地址作为可达.. 。

我已经尝试通过增加-W 1对ping减慢扫描,但这会导致性能不合格,并需要使用多线程

+2

的'&'运行'ping'进程在后台让你的状态下面是报告只报告发现并执行了'ping'(而不是''ping'退出时发生了什么)。使用shell脚本,我不认为有一种方法来加快这一点。寻找一个更好的工具,用于扫描IP范围。想到'nmap'。祝你好运。 – shellter

+0

谢谢Shelter我想这解释了为什么它很难找到我在找什么,我知道nmap,但希望在Bash中找到相同的效果,因为nmap没有默认安装 –

+0

bash不支持多线程。 'foo&'运行一个新的*进程*,而不是一个线程。 –

回答

2

作为编码的你有2个独立的,不相关的命令:

# run `ping` and place in background 
ping -c1 $line & 

# regardless of what the `ping` command does ... always 
# print 'reachable` and if that fails print `down` 
echo $line is reachable || echo $line is down 

我假设你真正想要的是使用ping(成功或失败)的结果,以确定哪些echo命令发布;在这种情况下,你需要用双`& &“像这样的替代单&

ping -c1 $line && 
echo $line is reachable || 
echo $line is down 

虽然这应该提供条件的输出,你坪现在在前台执行一个-AT-A-时间。

如果你想在后台运行的坪(即“多线程”)也执行条件打印,你可以放置ping/echo/echo代码的函数里面,然后在for循环做出了一个电话功能......确保放置在后台的函数调用,如:

网站

样本列表要平:

$ cat pinglist 
www.yahoo.com 
www.google.com 
www.peanut_butter.and_jelly 
www.bbc.co.uk 
www.not_today_your.not 

建议脚本:

$ cat pinger 
#!/bin/bash 
function pingit() { 

    target=${1} 

    # send stdout/stderr to /dev/null since all we need is the return code 

    ping -c1 ${target} >/dev/null 2>&1 && 
    echo ${target} is reachable || 
    echo ${target} is down 
} 

data=$(<pinglist) 

for line in ${data} 
do 
    # call our function and place the call in the background 

    pingit ${line} & 
done 

# wait for all outstanding background jobs to complete before continuing 

wait 

# [optional] let operator know we're done. 
echo "Completed." 

一些样品运行,同时要注意的是,输出消息的顺序会根据每个ping命令完成的速度有多快:

$ pinger 
www.yahoo.com is reachable 
www.google.com is reachable 
www.peanut_butter.and_jelly is down 
www.bbc.co.uk is reachable 
www.not_today_your.not is down 
Completed. 

$ pinger 
www.peanut_butter.and_jelly is down 
www.not_today_your.not is down 
www.google.com is reachable 
www.bbc.co.uk is reachable 
www.yahoo.com is reachable 
Completed. 

我们将再次运行测试和排序输出,忽略“已完成”。消息:

$ pinger | egrep -v "Completed" | sort 
www.bbc.co.uk is reachable 
www.google.com is reachable 
www.not_today_your.not is down 
www.peanut_butter.and_jelly is down 
www.yahoo.com is reachable 

!请记住,如果你有一长串主机可以ping通,并且你在一个小小的盒子上运行这个脚本,那么如果你启动数以千计的同时拨打的数千个电话,那么你的系统管理员可能不会太高兴......并且天堂禁止你犯一个编码错误,产生一个无限循环的命令。

这种类型的不端行为可以被编码为(例如,限制未ping来电或sleep荷兰国际集团为ping电话等每一个X号后几秒钟的数量),但我会离开这个编码功课;-)


如果你不想用的功能(例如,你正在做一个快速的命令行中环/平)来打扰,你可以包装在括号中ping/echo/echo并运行此结构在背景,虽然你会想要决定如何处理与工作有关的信息,例如:

$ data=$(<pinglist) 
$ for line in ${data} 
do 
    (ping -c1 ${line} >/dev/null 2>&1 && echo ${line} is reachable || echo ${line} is down) & 
done 
[1]  12212 
[2]  12213 
[3]  12214 
[4]  12215 
[5]  12217 
www.google.com is reachable 
www.peanut_butter.and_jelly is down 
www.not_today_your.not is down 
www.bbc.co.uk is reachable 
www.yahoo.com is reachable 
[5] + Done     for line in ${data};do; (ping -c1 ${line} >/dev/null 2>&1 && echo ${line} is reachable || echo ${line} is down) & 2>/dev/null;done 
[4] - Done     for line in ${data};do; (ping -c1 ${line} >/dev/null 2>&1 && echo ${line} is reachable || echo ${line} is down) & 2>/dev/null;done 
[3] Done     for line in ${data};do; (ping -c1 ${line} >/dev/null 2>&1 && echo ${line} is reachable || echo ${line} is down) & 2>/dev/null;done 
[2] Done     for line in ${data};do; (ping -c1 ${line} >/dev/null 2>&1 && echo ${line} is reachable || echo ${line} is down) & 2>/dev/null;done 
[1] Done     for line in ${data};do; (ping -c1 ${line} >/dev/null 2>&1 && echo ${line} is reachable || echo ${line} is down) & 2>/dev/null;done 

一个选项(组装机?),用于掩盖工作相关的消息需要包装我们ping/echo/echo/&中包含的语句和指导标准错误到/ dev/null的...

$ data=$(<pinglist) 
$ for line in ${data} 
do 
    {(ping -c1 ${line} >/dev/null 2>&1 && echo ${line} is reachable || echo ${line} is down) & } 2>/dev/null 
done 
www.peanut_butter.and_jelly is down 
www.not_today_your.not is down 
www.google.com is reachable 
www.yahoo.com is reachable 
www.bbc.co.uk is reachable 

...虽然这可能掩盖一些你可能感兴趣的错误信息,ymmv。

+0

令人难以置信的答案,但我只会发送ICMP到/ 24子网范围,我正在虚拟机上彻底测试 –

0

我先给GNU并行做一次他们都在平行对我来说,可能是32:

parallel -j 32 -a hosts.txt 'ping -c1 {} > /dev/null 2>&1 && echo {} is available || echo {} is down'