[ SHELL编程 ] shell多线程操作实例
Posted Beng Dou
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[ SHELL编程 ] shell多线程操作实例相关的知识,希望对你有一定的参考价值。
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是连通的即在使用中。如果没有,则可以判断未使用。如果只是查找一个IP,可以多试几个就知道了,但是这种靠试效率太低,不科学,写个循环批量查找下。
#!/bin/bash for i in $(seq 0 255);do ip="192.168.0.${i}" ping -c 1 ${ip} &>/dev/null if [ $? -ne 0 ];then printf "${ip} can not reachable\n" fi 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
如果是其他需要多进程执行的命令,可以修改一下。根据实际情况选择这两种方法之一实现。方法一相对更好理解。
以上是关于[ SHELL编程 ] shell多线程操作实例的主要内容,如果未能解决你的问题,请参考以下文章