检测存活主机脚本 并发


:Mr.zhou  阅读: 1,647 次

  脚本使用 ping 命令来检测主机是否存活。可以检测单一主机,也可以检测一个C类网段内的所有主机。脚本使每个 ping 命令在后台执行,达到并发的效果。在文章最后会进行有无并发时,脚本执行时间的对比。

  脚本内容:

#!/bin/bash
######################################
# Author  : Mr.Zhou                  #
# Email   : zhou@z-dig.com           #
# Website : http://www.z-dig.com     #
######################################
#
# Check Active Host

function CheckInput(){
if [ $# -ne 1 ] ; then
  return 1
else
  return 0
fi
}

function CheckIp(){
/bin/ipcalc -s -c $1 &>/dev/null
return $?
}

function PingIp(){
ping -c 2 -W 2 $1 &>/dev/null
if [ $? -eq 0 ] ; then
  echo $1 >> $TMP_ACTIVE
else
  echo $1 >> $TMP_DOWN
fi
}

function PingAll(){
PrefixIP=$(echo $1|awk -F '.' '{print $1"."$2"."$3"."}')
for ip in {1..254}
do
  IP="${PrefixIP}${ip}"
  PingIp $IP &
done
}

function SelectPing(){
ENDIP=$(echo $1|awk -F '.' '{print $NF}')
if [ $ENDIP -eq 0 -o $ENDIP -eq 255 ] ; then
  PingAll $*
else
  PingIp $*
fi
}

function SortIp(){
while :
do
PING_NUM=$(ps -ef|grep ping|grep -v 'grep'|wc -l)
if [ $PING_NUM -eq 0 ] ; then
`cat $TMP_ACTIVE|sort -t '.' -k 4 -n > /tmp/active.host`
`cat $TMP_DOWN|sort -t '.' -k 4 -n > /tmp/down.host`
rm -f $TMP_ACTIVE
rm -f $TMP_DOWN
break
fi
done
}

function Show(){
ACTIVEIP=$(cat /tmp/active.host)
DOWNIP=$(cat /tmp/down.host)
if [ -s "/tmp/active.host" ] ; then
  echo "Active Host:"
  echo $ACTIVEIP|tr " " "\n"
else
  echo "Down Host:"
  echo $DOWNIP|tr " " "\n"
fi
}
function main(){
CheckInput $*
if [ $? -ne 0 ] ; then
  echo -e $"USAGE: $0 {ipaddress}\nExample:\n$0 192.168.1.10  will check 192.168.1.10 only\n$0 192.168.1.0 will check 192.168.1.1 - 192.168.1.254 "
else
  CheckIp $*
  if [ $? -ne 0 ] ; then
    echo "Please input correct ip address . such as 192.168.1.10 or 192.168.1.0"
  else
    TMP_ACTIVE=$(mktemp)
    TMP_DOWN=$(mktemp)
    >/tmp/active.host
    >/tmp/down.host
    SelectPing $*
    SortIp
    Show
    rm -f /tmp/active.host
    rm -f /tmp/down.host
  fi
fi
}

main $*

  效果显示:

  环境:虚拟机网络为NAT模式,使用固定IP。物理机所在网段为 192.168.1.0

[root@z-dig ~]# uname -r
2.6.32-504.el6.x86_64
[root@z-dig ~]# ifconfig eth0|awk -F '[ :]+' 'NR==2{print $4}'
172.16.1.254
[root@z-dig ~]# 

  错误提示:

[root@z-dig ~]# sh check_active_host.sh 
USAGE: check_active_host.sh {ipaddress}
Example:
check_active_host.sh 192.168.1.10  will check 192.168.1.10 only
check_active_host.sh 192.168.1.0 will check 192.168.1.1 - 192.168.1.254 
[root@z-dig ~]# 
[root@z-dig ~]# sh check_active_host.sh 192.168.1
Please input correct ip address . such as 192.168.1.10 or 192.168.1.0
[root@z-dig ~]# 
[root@z-dig ~]# sh check_active_host.sh 192.168.1.a
Please input correct ip address . such as 192.168.1.10 or 192.168.1.0
[root@z-dig ~]# 

  检测单个主机:

[root@z-dig ~]# sh check_active_host.sh 192.168.1.1
Active Host:
192.168.1.1
[root@z-dig ~]# 

[root@z-dig ~]# sh check_active_host.sh 192.168.1.200
Down Host:
192.168.1.200
[root@z-dig ~]# 

  检测 C 段所有主机:

[root@z-dig ~]# sh check_active_host.sh 192.168.1.0
Active Host:
192.168.1.1
192.168.1.111
192.168.1.115
192.168.1.123
192.168.1.125
[root@z-dig ~]# 

  检测公网 C 段所有主机:

[root@z-dig ~]# sh check_active_host.sh 114.114.114.0
Active Host:
114.114.114.110
114.114.114.114
114.114.114.119
[root@z-dig ~]#

  是否使用并发,时间对比测试:

  使用并发:

[root@z-dig ~]# time sh check_active_host.sh 192.168.1.0
Active Host:
192.168.1.1
192.168.1.111
192.168.1.123
192.168.1.125
192.168.1.126

real    0m3.276s
user    0m0.852s
sys     0m1.813s
[root@z-dig ~]# 

  修改脚本,取消并发:

[root@z-dig ~]# time sh check_active_host_no.sh 192.168.1.0
Active Host:
192.168.1.1
192.168.1.104
192.168.1.111
192.168.1.115
192.168.1.123
192.168.1.125
192.168.1.126

real    12m29.965s
user    0m0.198s
sys     0m0.140s
[root@z-dig ~]#

  由测试数据可知,使用并发时的时间为 3s 多,不使用并发的时间为 12m 。

  下载该脚本:下载


转载请注明原文链接:http://www.z-dig.com/detection-of-viable-host-script.html



正文部分到此结束