分享一个在Linux下模拟多线程的并发脚本,使用这个脚本可以同时批量在定义数量的服务器上执行相关命令,比起普通for/while循环只能顺序一条一条执行的效率高非常多,在管理大批服务器时非常的实用。
     以下脚本功能是通过scp(也可选rsync)向上千台服务器传更新包,脚本运行后同时在后台有50个scp进程向服务器传包。
#!/bin/bash
ip=`cat iplist.txt|grep -v "#"|awk '{print $1}'`   #过滤服务器IP
dir='/usr/local/src'  #目标路径

thead_num=50 #自定义并发数,根据自身服务器性能或应用调整大小,开始千万别定义太大,避免管理机宕机
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++))   #利用for循环向管道中输入并发数量的空行
do
        echo ""  #输出空行
done >&4  #输出重导向到定义的文件描述符4上

for i in $ip  #循环所有要执行的服务器
do
        read -u4  #从管道中读取行,每次一行,所有行读取完毕后执行挂起,直到管道有空闲的行
                {
                        scp -P 1000 $1 $i:$dir    #所有要批量执行的命令都放在大括号内,scp是一个简单实例,可替换任意其他命令及命令组,1000为服务器端的端口
                        sleep 3  #暂停3秒,给系统缓冲时间,达到限制并发进程数量
                        echo "" >&4  #再写入一个空行,使挂起的循环继续执行
                }&  #放入后台执行
done
wait  #等待所有后台进程执行完成
exec 4>&-  #删除文件描述符
exit 0

--------------------------------低调的分割线------------------------------------
如果管理机与其他服务器没有建立ssh信任,也可将expect自动应答命令添加到并发脚本的循环体当中,修改如下:
#!/bin/bash
ip=`cat iplist.txt|grep -v "#"|awk '{print $1}'`
dir='/usr/local/src'
answer="yes"     #定义yes/no应答变量
passwd="123456"  #服务器密码
thead_num=50
tmp_fifo_file="/tmp/$$.fifo"
mkfifo $tmp_fifo_file
exec 4<>$tmp_fifo_file
rm -f $tmp_fifo_file
for ((i=0;i<$thead_num;i++))
do
        echo ""
done >&4
for i in $ip
do
        read -u4
                {
                        expect <<EOF
                        set timeout -1
                        spawn scp -P 1000 $1 $i:$dir
                        expect "(yes/no)?" {
                        send "$answer\r"
                        expect "Password:"
                        send "$passwd\r"
                        } "Password:" {send "$passwd\r"} "*host" {exit 1}
                        expect eof
                        EOF
                        
                        sleep 3
                        echo "" >&4
                }&
done
wait
exec 4>&-
exit 0

最新文章

  1. 给 VS 2010 选一个好用的代码行数统计器(转)
  2. Java线程同步
  3. Ros与Vrep平台搭建
  4. Linux学习笔记(16)shell基础之Bash变量
  5. android框架整理
  6. iOS - MVP 架构模式
  7. 使用POI读取excel文件内容
  8. Android IOS WebRTC 音视频开发总结(十五)-- 培训课程大纲
  9. 如何判断一个js对象是不是Array
  10. 开源存储之ceph
  11. codeforces 15D . Map 优先队列
  12. 源码安装Nginx加TCP反向代理模块
  13. Doctirne---查询更新等操作
  14. 【mmall】IDEA插件jrebel
  15. 【Android】Android 4.0 Launcher2源码分析——启动过程分析
  16. Webhook 实践 —— 自动部署
  17. 114、drawable和mipmap 目录下图片的区别
  18. ESP-IDF版本更新说明(V2.1版)转自github(https://github.com/espressif/esp-idf/releases/)
  19. Grails 第二课
  20. CH3B16 魔法珠

热门文章

  1. 开源的 .Net Core MVC CMS 推荐
  2. Centos 固定ip
  3. Vim Clutch | 面向脚踏板编程
  4. HTML中特殊字符
  5. GitHub访问下载太慢解决办法
  6. JavaWeb学习笔记(二十二)—— 过滤器filter
  7. Domain 表达式的用法
  8. 向指定url发送请求与获取响应
  9. 关于tp5全局过滤
  10. springboot 接口返回数据时 net.sf.json.JSONNull[&quot;empty&quot;]) 异常