Linux系统“并发”批量ping测试主机脚本

#!/bin/bash
trap "ps -ef|grep $0|grep -v grep|awk '{print \$2}'|xargs kill -9" 2   ###捕获ctrl+c 终止脚本执行;
if [ ! -n "$1" ];then    ###判断ip列表位置参数是否存在;
	echo -e "\033[0;31mUse incorrect. Please add ip_list parameters!\033[0m"
	echo 'Usage: batchping $ip_list'  ###脚本使用方法;
	exit 1
else
	if [ ! -f "$1" ];then  ###判断ip地址列表文件是否存在;
		echo " $1 ip list file does not exist!"
		exit 1
	fi
fi
ip_list=`cat $1`
THREAD=5               ###声明并发线程并发个数;
TMPFIFO=/tmp/$$.fifo   ####声明管道名称,'$$'表示脚本当前运行的进程PID;
mkfifo $TMPFIFO        ###创建管道;
exec 5<>${TMPFIFO}
###创建文件标示符“5”;这个数字可以为除“0”、“1”、“2”之外的所有未声明过的字符,以读写模式操作管道文件,系统调用exec是以新的进程去代替原来的进程,但进程的PID保持不变,换句话说就是在调用进程内部执行一个可执行文件;

rm -rf ${TMPFIFO}  ####清除创建的管道文件;

for((i=1;i<=$THREAD;i++));do echo;done >&5    ###为并发线程创建同样个数的占位;

for i in $ip_list;do
    read -u5   ###read中 -u 后面跟fd,表示从文件描述符中读入,该文件描述符可以是exec新开启的;
    {
    while :; do
        result=`ping -s 1472 -W 1 -c 1 $i | grep 'bytes from '` ###一次以1472字节ping一个包,并过滤ping结果;
        if [ $? -gt 0 ]; then  ###判断result结果是否成功;
            echo -e "`date +'%Y/%m/%d %H:%M:%S'` - host $i is \033[0;31mdown\033[0m" |tee -a  $i.log
            continue
        else
            echo -e "`date +'%Y/%m/%d %H:%M:%S'` - host $i is \033[0;32mok\033[0m -`echo $result | cut -d ':' -f 2`" |tee -a $i.log
        fi
    sleep 1   ###防止ping连续执行泛洪,每次执行间隔1秒;
    done
        echo "" >&5  ###任务执行完后在fd5中写入一个占位符,以保证这个线程执行完后,线程继续保持占位;
    } &   ###维持管道中永远是固定线程数,&表示该部分命令/任务放入后台不占当前的bash,实现并行处理;
done
wait   ###等待前面的线程执行;
exec 5>&-  ###关闭fd5管道;
exit 0     ###正常退出程序;

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值