设为首页 加入收藏

TOP

Bash多进程批量处理
2015-02-02 14:10:54 来源: 作者: 【 】 浏览:22
Tags:Bash 进程 批量 处理

首先看需求:


同时控制1000台Linux服务器做同一件事。


怎么办?肯定用脚本批量处理,因为我目前还没有1000台Linux,所以我们用一些脚本来模拟。


1.首先模拟我需要做的事,假设我处理一台Linux需要费时5s 那么我的模拟脚本如下:


cat nothing.sh
#!/bin/bash
sleep 5? ? ? ? //发呆5秒
echo `date`? ? //输出当前系统日期
? ? 好,那么这件事我要做1000次,那么for循环走起:
#!/bin/bash
for i in `seq 1000`
do
sh nothing.sh
done
exit 0


运行的时候,你会发现每过5s 输出了1行 date 的值,我们循环了1000次,那这个脚本执行完需要的时间至少是1000*5s 大约等于1个半小时。由于循环是串行的,脚本必须等待上一条循环结束,才能进行下一步的循环。


这个时候我们就有需求了:


我肯定不能等那么久,既然现在的CPU都是多进程的,我能不能开多个进程去同时完成我需要的任务呢?答案是肯定的。


一个新的多进程并发脚本:


#!/bin/bash
tmp_fifofile="/tmp/$$.fifo"? ?
mkfifo $tmp_fifofile? ? ? ? ? ? //新建一个fifo类型的文件
exec 6<>$tmp_fifofile? ? ? ? //将标示符(fd6)指向fifo类型文件
rm -rf $tmp_fifofile? ? ? ? ? ? //可删可不删


thread=1000? ? ? ? ? ? ? ? //这里定义了我需要多个进程去干活
for ((i=0;i<$thread;i++))?
do
echo ""
done >&6? ? ? ? //就是在fd6中放置了$thread个空行


for ((i=0;i<1000;i++))? ? ? ? //1000次循环,开了1000个进程
do
read -u6? ? ? ? // 一次read -u6 就从fd6中去掉一个空行,然后向下执行,如果fd6中的空行没有了,就停在这里等待位置,从而实现了进程数量的控制。所以如果 我thread的值设为50个,那么其实我就是在用这50个进程就干活,如果进程开满了,就不会再开新的进程,如果旧的进程结束了,那么就会有新的进程进来继续干活。
? ? ? ? {
? ? ? ? sh nothing.sh? ? ? ? //这里是我需要干什么活
? ? ? ? echo "">&6? ? ? ? ? ? //每个进程结束后,向fd6返回一个空行,告诉它, 我的活干完了,我的位置腾出来。
? ? ? ? } &? ? ? ? ? ? //命令是放在后台执行的
done
wait? ? ? ? ? ? //等待所有后台进程结束
exec 6>&-? ? //关闭fd6


exit 0


这样的话我们,如果按照我上面的脚本,就是开了1000个进程去同时执行nothing.sh脚本,那么我们总共花费的时间,其实也就是一个进程执行的时间,大约5.5s 。相比于1个半小时,我们节约了太多的时间。


注意:如果你的系统设置了进程上限,请使用 ulimit -s unlimited 来更改为无限制。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android实现简单的相机程序 下一篇Python多线程运维脚本

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: