目标:使用可以在许多主机上有效并行的方法检查主机是否在网络上启动并运行。
强调支票的快速周转。
强调速度的原因:需要快速连续执行多项检查(数百次)并相当快地返回结果。
目前的方法
当前脚本使用一个简单的ping
命令。该选择不是强制性的,相反任何可以使用具有相同或更好的可靠性和速度的合适工具作为替代品。
当前脚本
沿着这些思路:
ping -c 1 -W 100 -q "$NETWORK_HOST" &> /dev/null
这种方法的明显缺陷是:需要在亚秒级的时间内做出响应,根据经验,这可能会等待一秒。
考虑替代方案
忘记顺序执行的速度,ping
使用 GNU 并行运行许多命令parallel
并在最后整理结果。这已经被试验过,但在实践中似乎更糟糕。
关于更好解决方案的直觉
这好像是ping
可能作为“轮询健康检查”工作得很好,它需要做的就是等待很少的时间和超时,以防没有响应。
假设:网络被认为是可靠且快速的,主机不一定具有其中任何一种品质。
问题
你会如何解决这个问题?您会使用哪种工具?这是正确的方法吗?您能提供一个代码片段吗?
- 环境:OS X + Ubuntu 主机
- 脚本外壳:Bash
- 如果需要,可以安装附加软件。
- 可以为不在存储库中的应用程序编译/安装新代码并使用它。
答案1
如果 ping 对您来说足够好,平是一种可以立即并行工作的替代方案。
这是我使用的简化版本。它与通过管道传入的主机列表(每行一个)一起使用:
probe_hosts() {
local report
fping 2>/dev/null | while read report;
do
local host=${report/ is *}
local state=${report/* is }
if [ "$state" == "alive" ];
then
echo $host
else
echo unreachable: $host >&2
fi
done
}
# this is how you use it:
cat list_of_hosts \
| probe_hosts \
| do_something_with_live_hosts
答案2
您可以给出nmap
一个范围:
$ nmap -sn 138.0.0.0/24
$ nmap -sn 138.0.0.0-255
该-sn
标志意味着仅 ping 主机并返回(即不像nmap
通常那样进行端口扫描)。
编辑:阅读评论后,我看到巴哈马特提到了arp
。事实上,arp
在没有参数的情况下,运行速度比nmap
我快,并找到连接到我的 LAN 的所有内容:
$ time arp
real 0m0.411s