shell脚本实现并发并控制进程的数量

一、准备跑多进程的脚本:

[root@V71 shell]# cat many.sh 
#!/bin/bash

if [ $# != 2 ]; then                                                            #脚本接受2个参数,IP.TXT,和cmd
echo "pls input two args"
exit 1;
fi

function execcmd()                                                       #多进程执行的函数,内容就是SSH远程机器执行命令
{
sshpass -p $3 ssh -n $2@$1 $4                                
}


function manyppid()                                                      #多进程函数
{
#进程数+1,后面引用的从0开始,是小于等于,这样应该有11个进程同时在跑
Threads=10

#定义fifo文件
FifoFile="$$.fifo"

#新建fifo文件
mkfifo $FifoFile

#将fd6与此fifo类型文件以读写的方式连接起来,fd文件描述符
exec 6<>$FifoFile      
rm $FifoFile

#在文件描述符当中放置和进程个数相等的回车符 echo;产生11个回车符,执行的时候读取fd6就等于产生11个子进程
for ((i=0;i<=$Threads;i++));
do echo;
done >&6

#$1为向函数传递的第一个参数,将是一个文件,保存有多列的IP,用户名,密码,用空格分隔,把$1读取到文件描述符5

exec 5<$1                           
count=0  #初始化计数0,变量用来计算总共的任务数量

while read -u5 line
do
read -u6
let Count+=1
ips=`echo $line | cut -d" " -f1`
uname=`echo $line | cut -d" " -f2`
pwd=`echo $line | cut -d" " -f3`
{
echo $Count   #仅用来标记提示的作用

execcmd $ips $uname $pwd $2      #执行函数,$2为远程执行的命令

sleep 10
echo >&6 
#有进程执行完成,向fd6 ehco空,等于换行,补回足够的进程数量11
} &  #&号表示放后台多线程执行

done

wait 
exec 6>&-              #销毁fd6
exec 5>&-              #销毁fd5
}

date         #标记开始的时间
manyppid $1 $2
date         #标记结束的时间

 

 

二、测试脚本用到的两个参数:

ip.txt和/tmp/date.sh

第一个参数,IP用户名密码的文件

[root@V71 ~]# wc -l /shell/ip.txt 
132 /shell/ip.txt

132行,里面都是IP,用户名,密码,用空格分隔

 

第二个参数,将要在远程执行的命令

[root@V71 ~]# cat /tmp/date.sh 
#!/bin/bash
date >> /tmp/date.txt

 

 

三、测试:

[root@V71 shell]# sh many.sh ip.txt /tmp/date.sh         #sh -x 可以看执行的过程

[root@V71 shell]# rm -rf /tmp/date.txt           
[root@V71 shell]# sh many.sh ip.txt /tmp/date.sh 
2019年 10月 15日 星期二 22:32:06 CST
1
2
3

...

132
2019年 10月 15日 星期二 22:34:32 CST

可以打开另一个终端,再查看后台进程的数量,一个主进程,11个子进程

shell脚本实现并发并控制进程的数量_第1张图片

 

 

 

你可能感兴趣的:(shell脚本实现并发并控制进程的数量)