#!/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 ###正常退出程序;
Linux系统“并发”批量ping测试主机脚本
于 2023-09-13 15:46:19 首次发布