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个半小时,我们节约了太多的时间。

(下一篇将带来python版)

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

时间: 2024-10-06 09:32:56

bash多进程批量处理的相关文章

SFTP基于Key多进程批量并发上传文件实现案例(python)

最近在研究Paramiko,Paramiko可以非常方便的实现基于SSH协议的远程连接,可以基于 口令,也可以无口令RSA非对称密钥,亦可以实现SFTP上传下载操作,安全高效,再结合多 进程或者是多线程就可以实现并行处理,写了一个简单的SFTP基于Key多进程批量并发上传 文件的实现案例,供以后参考. 安装加密模块和Paramiko模块 下载:pycrypto-2.6.1.tar.gz paramiko-1.10.1.tar.gz 安装: tar -zxf pycrypto-2.6.1.tar.

Bash漏洞批量检测工具与修复方案

&amp;amp;lt;img src="http://image.3001.net/images/20140928/14118931103311.jpg!small" title="shellshock-bug-bash-bashbug-938x535.jpg"/&amp;amp;gt;&amp;amp;lt;/strong&amp;amp;gt;&amp;amp;lt;/span&amp;amp;gt;&a

批量复制文件

1 #!/bin/bash 2 #批量复制文件到指定的目录 3 #需求:有很多文件需要在一个文件目录查找到相对应的文件,然后把它复制到新建目录 4 #方法1:find /media -name 'a'* |xargs -I [] cp [] /mnt 5 #方法2:进入存放文件目录执行 ls|grep a |xargs -I [] cp [] /mnt 6 #方法3:首先新建一个txt文件,把表名写进去,然后执行下面脚本 7 for file in `cat a.txt`;do 8 a=`ls|

Cacti 系统批量添加Device脚本

[功能]: 自动添加设备,自动生成模板图像; 自动生成远程抓取的数据图像; 自动添加到相应的组. [准备工作]: 1.启动客户端snmpd服务,并设置snmpd.conf文件: /etc/init.d/snmpdstart ;chkconfig snmpd on [[email protected] .ssh]# cat /etc/snmp/snmpd.conf com2sec notConfigUser  default      public group  notConfigGroup v1

批量删除用户

参考脚本如下 1 #!/bin/bash 2 #批量删除用户 3 4 5 for Deluser in zhangsan liming wangxiao 6 do 7 userdel $Deluser 8 echo "$Deluser用户删除成功" 9 done

批量创建用户与批量文件重命名

title: 批量创建用户与批量文件重命名 tags: 批量,用户,创建,重命名 批量创建用户与批量文件重命名 1. 批量创建用户 如果需要批量创建用户,且用户名为stu01-stu10,用户密码为随机的10位密码. 1.1 分析解答 如果用户名为stu01的话,我们可以采用for循环,直接变量范围为01-10,密码随机的话我们可以采用系统默认的随机变量RANDOM,因为默认的RANDOM只有5位数字,因此我们可以给它md5加密,然后取其中的8位字符当做密码.当然我们也可以不用循环,直接使用命令

MS12-020漏洞复现及自动化批量利用

漏洞描述 Windows 远程桌面协议漏洞,可执行代码,POC可导致蓝屏.(RDP远程桌面执行代码漏洞) 影响目标 Windows XP sp3 Windows xp sp2 Windows Vista sp2 Windows 7 Windows Server 2003 Windows Server 2008 Windows Server 2008 R2 msfpayload利用 msfconsole use auxiliary/dos/windows/rdp/ms12_020_maxchann

脚本_批量修改文件后缀名

#!bin/bash#功能:批量修改文件的后缀名,比如: 将.txt文件修改为.doc文件#作者:liusingbon#执行脚本时,需要在脚本名后面添加位置参数(文件后缀名)#例: 脚本名 txt doc (可以将以.txt结尾的文件修改为以.doc结尾)#例: 脚本名 doc jpg (可以将以.doc结尾的文件修改为以.jpg结尾)for i in "ls *.$1"do     mv $i  ${i%.*}.$2done 原文地址:https://www.cnblogs.com/

shell 变成100例

本文摘自:https://zhuanlan.zhihu.com/p/84529054 侵权必删!!!!! 1.编写hello world脚本 #!/bin/bash # 编写hello world脚本 echo "Hello World!" 2.通过位置变量创建 Linux 系统账户及密码 #!/bin/bash # 通过位置变量创建 Linux 系统账户及密码 #$1 是执行脚本的第一个参数,$2 是执行脚本的第二个参数 useradd "$1" echo &qu