一、准备跑多进程的脚本:
[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个子进程