shell脚本并发

#!/bin/bash
# Filename: bingfa.sh
# Time: 2016/03/9 18:59:05

ip=`cat /tmp/iplist`            # 服务器ip地址
                                
function thread() {                                  
thead_num=10                    # 自定义并发数,根据自身服务器性能或应用调整大小,开始千万别定义太大,避免管理机宕机
tmp_fifo_file="/tmp/$$.fifo"    # 以进程ID号命名管道文件
mkfifo $tmp_fifo_file           # 创建临时管道文件
exec 4<>$tmp_fifo_file          # 以读写方式打开tmp_fifo_file管道文件,文件描述符为4,也可以取3-9任意描述符
rm -f $tmp_fifo_file            # 删除临时管道文件,也可不删除

for ((i=0;i<$thead_num;i++)); do    # 利用for循环向管道中输入并发数量的空行
  echo ""                       # 输出空行
done >&4                        # 输出重导向到定义的文件描述符4上

# 真正的要执行的所有命令在下面的大括号中
for i in $ip; do                # 循环所有要执行的服务器
  read -u4                      # 从管道中读取行,每次一行,所有行读取完毕后执行挂起,直到管道有空闲的行
    {                           # 大括号里面就是所有要执行的命令
     echo $i                    # 显示主机ip
     scp $1 $i:/tmp/test.txt    # scp是一个简单实例,执行脚本时$1传入一个变量值,可替换任意其他命令及命令组
     ssh $i -n 'date'           # 打印时间
     $1                         # 定义命令参数1,方便调用
     $2                         # 定义命令参数2,方便调用
     sleep 3                    # 暂停3秒,给系统缓冲时间,达到限制并发进程数量
     echo "" >&4                # 再写入一个空行,使挂起的循环继续执行
    }&                          # 放入后台执行
done

wait                            # 等待所有后台进程执行完成
exec 4>&-                       # 删除文件描述符
exit 0
}
# 定义命令函数1
function command_1() {
ssh $i 'date;'
}
# 定义命令函数2
function command_2() {
ssh $i 'echo "Hello world!!!"'
}

#### main ####
thread command_1 command_2 # 调用并发函数thread并引用command_1和command_2函数,此时变量"$1=command_1",变量"$2=command_2"。当然可以引用多个定义的函数,只要在threa中定义了多个变量。
sh bingfa.sh /tmp/test.txt # 执行脚本,结果如下,对三个主机执行并发操作
  10.11.8.10
  10.11.8.11
  10.11.8.12
  Fri Mar 09 19:32:50 CST 2016
  Fri Mar 09 19:32:50 CST 2016
  Fri Mar 09 19:32:50 CST 2016
  Hello World!!!
  Hello World!!!
  Hello World!!!


你可能感兴趣的:(并发,shell,shell并发,并发函数)