[技术干货] Shell脚本高效检测主机存活

[复制链接]
乐维 发表于 2021-1-18 10:38:15 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
需求:
某运维公司的小A,想要重新规划IP地址。他想要检测到192.168.1.0网段中未被使用的ip进行规划分配,那么如果已经分配的ip,则不使用。
实现过程:shell脚本实现
在服务器任意目录创建test.sh脚本,脚本内容如下
#!/bin/bash
#测试存活的主机
test()
{
for i in $(seq 1 20)
do
  ping -c 2 192.168.1.$i > /dev/null
  if [ $? -eq 0 ];then
     echo "192.168.1.$i,存活"
  else
    echo "192.168.1.$i,失败"
   fi
done
}
test
注意:在测试脚本的过程中,我们可以抽样测试几台主机,等确认脚本是成功的话,才把循环里的20变成254。前期再不确定脚本的前提下,不应该一下子循环所有的主机。
上面的脚本内容中
Ping -c 2代表,如果ping某个iP两次没有数据返回,则说明该ip未分配
实验验证
1.png
结论:ping一台成功的主机大概需要1s,一台失败的主机要2s
假如该网段所有主机都是失败,则需要254*2=408s才能全部iP检查完毕,耗时非常慢
优化脚本:(多线程)
把脚本内容改成如下即可
2.png
#!/bin/bash
for i in {1..20}
do
    {
    ping -c 2 192.168.1.$i >/dev/null
    if [ $? = 0 ];then
        echo "192.168.1.$i 存活"
    else
        echo "192.168.1.$i 不存活"
    fi
    } &
done
wait
&是把进程放到后台,不用等待,wait是等所有进程都执行完才推出。如果没有wait可能会导致程序无法退出,原因是父进程先退出,子进程还没执行完。这种情况就是所谓的僵尸进程。
注意:多线程展示的结果和实现过程的脚本一致,只不过多线程的脚本是不用等待的,所以它展示的结果不是按ip的顺序展示的
结果验证
脚本优化前:
3.png
脚本优化后
4.png
执行效率快了8
多线程每次的执行的结果,ip排序都不一致
5.png

技术交流欢迎加入Q群:177428068





上一篇:Linux根目录分区大小调整教程
下一篇:shell脚本之灵活调用函数技巧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝0

帖子330

发布主题
最新发布

乐维社区

微信公众号

版权所有 © 2016-2021 九一乐维丨粤ICP备17007026号