linux多进程处理经验,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

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 来更改为无限制。

0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值