作为编码的你有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。
的'&'运行'ping'进程在后台让你的状态下面是报告只报告发现并执行了'ping'(而不是''ping'退出时发生了什么)。使用shell脚本,我不认为有一种方法来加快这一点。寻找一个更好的工具,用于扫描IP范围。想到'nmap'。祝你好运。 – shellter
谢谢Shelter我想这解释了为什么它很难找到我在找什么,我知道nmap,但希望在Bash中找到相同的效果,因为nmap没有默认安装 –
bash不支持多线程。 'foo&'运行一个新的*进程*,而不是一个线程。 –