Shell多进程获取未使用IP方法


1、需求

查找192.168.0.*网段中所有未使用过的IP

2、实现

我们知道查找未使用IP的方法可以使用ping命令完成。对于单个IP的判断,使用命令如下

$ ping -c 1 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=0.031 ms

--- 192.168.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.031/0.031/0.031/0.000 ms

如果上述类似消息,则判断该IP是连通的即在使用中。如果没有,则可以判断未使用(这里不考虑对端服务器ping被禁用的情况)。如果只是查找一个IP,可以多试几个就知道了,但是这种效率太低,可以写个循环批量查找下。

#!/bin/bash

for i in $(seq 0 255);do
    ip="192.168.0.${i}"
    ping -c 1 ${ip} &>/dev/null
    [ $? -ne 0 ] && printf "${ip} can not reachable\n"
done

这个例子实现了批量查找192.168.0.*网段内未使用过的IP。但是执行时候发现效率很低,可以自己执行看下运行效果。显然,这没有解决效率的问题。这时我们考虑使用多进程解决这个问题。看下面例子。

#!/bin/bash

MAX_THREAD_NUM=50

for i in $(seq 0 255);do
    ip="192.168.0.${i}"
    (
      ping -c 1 ${ip} &>/dev/null
      [ $? -ne 0 ] && printf "${ip} can not reachable\n"
      )&
    num_ping=`ps -ef | grep "ping" | grep -v grep | wc -l`
    while [ "${num_ping}" -gt "${MAX_THREAD_NUM}" ];do
      sleep 1
      num_ping=`ps -ef | grep "ping" | grep -v grep | wc -l`
    done
done
wait

执行发现效率数倍提升。上述的例子是利用&将进程放到后台执行,并且通过循环判断当前ping命令执行的进程数来控制进程数量。这里MAX_THREAD_NUM设置的为50,考虑ping不太消耗资源可以还可以调整更大。如果是消耗资源多的命令应该将MAX_THREAD_NUM调小。具体根据服务器性能和命令消耗资源情况调整。

还有一种利用文件描述符、read的方法,我们一块写下看下,效果是一样的,例子如下

#!/bin/bash

temp_fifofile="/tmp/$$.fifo"
mkfifo ${temp_fifofile}
exec 5<>${temp_fifofile}
rm ${temp_fifofile}

MAX_THREAD_NUM=50
for ((i=0;i<${MAX_THREAD_NUM};i++));do
  echo
done >&5

for((i=0;i<=255;i++));do
  read -u5
  (
    ip="10.135.17.${i}"
    ping -c 1 ${ip} &>/dev/null
    [ $? -ne 0 ] && printf "${ip} can not reachable\n"
     echo >&5
   )& 
done
wait
exec 5>&-
exit 0

如果是其他需要多进程执行的命令,可以修改一下。根据实际情况选择这两种方法之一实现。方法一相对更好理解。

优质内容筛选与推荐>>
1、Java开发笔记(一百零一)通过加解锁避免资源冲突
2、Windows Azure 社区新闻综述(#78 版)
3、Cufon中文字符无法识别的解决方案(转载)
4、通过 HTTPS 和 SSL 确保 Windows Azure 网站 (WAWS) 安全
5、MATLAB提取人脸轮廓 和 五官


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn