標籤:ttl 進程數量 data shell編程 完成 smi font null code
1、需求
尋找192.168.0.*網段中所有未使用過的IP
2、實現
我們知道尋找未使用IP的方法可以使用ping命令完成。對於單個IP的判斷,使用命令如下
$ ping -c 1 192.168.0.1PING 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 0msrtt min/avg/max/mdev = 0.031/0.031/0.031/0.000 ms
如果上述類似訊息,則判斷該IP是連通的即在使用中。如果沒有,則可以判斷未使用。如果只是尋找一個IP,可以多試幾個就知道了,但是這種靠試效率太低,不科學,寫個迴圈批量尋找下。
#!/bin/bashfor 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" fidone
這裡,實現了批量尋找192.168.0.*網段內未使用過的IP。但是執行命令的時候你發現執行非常慢(這裡不貼出執行結果,大家可以自己執行感受一下)。顯然,這沒有解決效率的問題。這時你肯定想到了如果使用多進程就可以解決這個問題了。是的。我們看下下面的例子。
#!/bin/bashMAX_THREAD_NUM=50for 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` donedonewait
執行發現效率數倍提升。上述的例子是利用&將進程放到後台執行,並且通過迴圈判斷當前ping命令執行的進程數來控制進程數量。這裡MAX_THREAD_NUM設定的為50,考慮ping不太消耗資源可以還可以調整更大。如果是消耗資源多的命令應該將MAX_THREAD_NUM調小。具體根據伺服器效能和命令消耗資源情況調整。
還有一種利用檔案描述符、read的方法,我們一塊寫下看下,效果是一樣的,例子如下
#!/bin/bashtemp_fifofile="/tmp/$$.fifo"mkfifo ${temp_fifofile}exec 5<>${temp_fifofile}rm ${temp_fifofile}MAX_THREAD_NUM=50for ((i=0;i<${MAX_THREAD_NUM};i++));do echodone >&5for((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 )& donewaitexec 5>&-exit 0
如果是其他需要多進程執行的命令,可以修改一下。根據實際情況選擇這兩種方法之一實現。方法一相對更好理解。
[ SHELL編程 ] shell多線程操作執行個體