shell 脚本的并发

回复 收藏

让你的shell脚本支持并发

比如你想使用expect 去批量执行100台服务器的w命令,或者 你想使用scp把远程100台的服务器日志拉取到本地来。这时候,并发执行的效果就体现出来了。

原理:

    生成一个FIFO ,初始时给管道内写入几个字符串(每一个字符串就表示你要打开一个进程,可以通过控制字符的数量来控制并发的进程数),然后每从管道内读出一个字符串就生成一个子进程,当管道内没有字符串可读时就阻塞在那里,不能创建新的子进程,一直等到有新的字符串进来时才继续运行。当每个并发进程执行完毕时又向管道内写入一个字符串,表示当前子进程已执行完毕,可以创建新的子进程了

看代码:

#!bin/bash  
PRONUM=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 表示你总的任务数量。

2017-12-14 15:34 举报
已邀请:
0

阿铭 管理员

赞同来自:

回复帖子,请先登录注册

退出全屏模式 全屏模式 回复
评分
可选评分理由: