一、前言
我们在用shell编程时,当用到循环语句时,如果循环的对象数量比较多,则代码一条一条处理,时间消耗会特别慢。如果此时机器资源充足,不妨学会多线程并发处理这招,帮助你提前打卡完成工作。
二、控制多线程方法
就是在你原先代码脚本中,循环部分添加上以下内容:
######控制多线程#################
THREAD_NUM=30 #线程数量定义
[ -e /tmp/fd1 ] || mkfifo /tmp/fd1 #创建有名管道
exec 9<>/tmp/fd1 #创建文件描述符,以可读()的方式关联管道文件,这时候文件描述符3就有了有名管道文件的所有特性
rm -rf /tmp/fd1 #关联后的文件描述符拥有管道文件的所有特性,所以这时候管道文件可以删除,我们留下文件描述符来用就可以了
#预先写入指定数量的换行符,一个换行符代表一个进程
for ((i=1;i
do
echo -ne "\n" >&9
done
###process crontrol######
read -u9
{
#######此次加上循环部分代码##########
echo >&9
}&
三、应用实例
假设有这个一个批量ping ip地址的脚本,你需要PING 100个IP
#!/bin/bash
fname=hosttable.txt
number=`cat $fname|wc -l`for ((i=1;i<=$number;i++))
doip=`head -$i $fname|tail -1|cut -d" " -f1`
ipname=`head -$i $fname|tail -1`
ping -c 1 $ip &>/dev/null
if [ $? -eq 0 ];then
echo "$ipname connect ok"
else
echo "$ipname no connect"
fi
done
直接执行,完成消耗时间3分43秒
加上线程控制后 ,再执行,完成消耗时间只需要6s;效率提升30多倍;在循环体量更大时,节约时间会更多,所以现在你学会了嘛~
#!/bin/bash
fname=hosttable.txt
number=`cat $fname|wc -l`######控制多线程#################
THREAD_NUM=30 #线程数量定义
[ -e /tmp/fd1 ] || mkfifo /tmp/fd1 #创建有名管道
exec 9<>/tmp/fd1 #创建文件描述符,以可读(<)可写(>)的方式关联管道文件,这时候文件描述符3就有了有名管道文件的所有特性
rm -rf /tmp/fd1 #关联后的文件描述符拥有管道文件的所有特性,所以这时候管道文件可以删除,我们留下文件描述符来用就可以了
#预先写入指定数量的换行符,一个换行符代表一个进程
for ((i=1;i<=$THREAD_NUM;i++))
do
echo -ne "\n" >&9
donefor ((i=1;i<=$number;i++))
doip=`head -$i $fname|tail -1|cut -d" " -f1`
ipname=`head -$i $fname|tail -1`
###process crontrol begin########
read -u9
{
ping -c 1 $ip &>/dev/null
if [ $? -eq 0 ];then
echo "$ipname connect ok"
else
echo "$ipname no connect"
fi########process crontrol end#####
echo >&9
}&done