让你的shell脚本支持并发
比如你想使用expect 去批量执行100台服务器的w命令,或者 你想使用scp把远程100台的服务器日志拉取到本地来。这时候,并发执行的效果就体现出来了。
原理:
生成一个FIFO ,初始时给管道内写入几个字符串(每一个字符串就表示你要打开一个进程,可以通过控制字符的数量来控制并发的进程数),然后每从管道内读出一个字符串就生成一个子进程,当管道内没有字符串可读时就阻塞在那里,不能创建新的子进程,一直等到有新的字符串进来时才继续运行。当每个并发进程执行完毕时又向管道内写入一个字符串,表示当前子进程已执行完毕,可以创建新的子进程了。
看代码:
#!bin/bashPRONUM=10 #进程个数
tmpfile="$$.fifo" #临时生成管道文件
mkfifo $tmpfile # Create named pipes (FIFOs) with the given NAMEs,管道是为进程之间通信的
exec 6<>$tmpfile # 把6号通道赋予这个FIFO文件
rm $tmpfile #清除掉这个临时文件
#生成令牌:
for(( i=0; i<$PRONUM; i++ )) #需要并发多少个进程数就往通道写入一个字符
do
echo
done >&6 #写入通道6 里
#并发执行任务:
count=200 #总任务数
for(( i = 0; i < ${count}; i++ ))
do
read -u6 #从管道6里拿出一个令牌
{
commands #执行任务的命令
echo >&6 #任务执行完成后,放回令牌,以便于下一波并发的执行
}& #丢入系统 后台执行。
done
wait #等待所有的任务执行完成后再退出脚本
exec 6>&- #退出前销毁通道。
上面是一个模板,commands就是要你并发处理的任务,可以是scp ,curl 等shell命令,也可以是里面的函数fuctions。PRONUM 表示你要启动的并发进程数量,而count 表示你总的任务数量。
编辑回复