分享一个在Linux下模拟多线程的并发脚本,使用这个脚本可以同时批量执行相关命令,比起普通for/while循环只能顺序一条一条执行的效率高,在管理大批服务器时非常的实用。
     以下脚本功能是通过scp(也可选rsync)向上千台服务器传更新包,脚本运行后同时在后台有50个scp进程向服务器传包。

#!/bin/bash
#过滤服务器IP
ip=`cat iplist.txt|grep -v "#"|awk '{print $1}'`
#目标路径
dir='/usr/local/src'
#自定义并发数,根据自身服务器性能或应用调整大小,开始千万别定义太大,避免管理机宕机
thead_num=50
#以进程ID号命名管道文件
tmp_fifo_file="/tmp/$$.fifo"
#创建临时管道文件
mkfifo $tmp_fifo_file
#以读写方式打开tmp_fifo_file管道文件,文件描述符为4,也可以取3-9任意描述符
exec 4<>$tmp_fifo_file
#删除临时管道文件,也可不删除
rm -f $tmp_fifo_file
#利用for循环向管道中输入并发数量的空行
for ((i=0;i<$thead_num;i++))
do
#输出空行echo ""
#输出重导向到定义的文件描述符4上
done >&4
#循环所有要执行的服务器
for i in $ip
do
#从管道中读取行,每次一行,所有行读取完毕后执行挂起,直到管道有空闲的行read -u4  {
#所有要批量执行的命令都放在大括号内,scp是一个简单实例,可替换任意其他命令及命令组,1000为服务器端的端口scp -P 1000 $1 $i:$dir
#暂停3秒,给系统缓冲时间,达到限制并发进程数量  sleep 3
#再写入一个空行,使挂起的循环继续执行echo "" >&4  }&  #放入后台执行
donewait  #等待所有后台进程执行完成
exec 4>&-  #删除文件描述符
exit 0

--------------------------------低调的分割线------------------------------------
如果管理机与其他服务器没有建立ssh信任,也可将expect自动应答命令添加到并发脚本的循环体当中,修改如下:

#!/bin/baship=`cat iplist.txt|grep -v "#"|awk '{print $1}'`dir='/usr/local/src'answer="yes"     #定义yes/no应答变量
passwd="123456"  #服务器密码
thead_num=50tmp_fifo_file="/tmp/$$.fifo"mkfifo $tmp_fifo_fileexec 4<>$tmp_fifo_filerm -f $tmp_fifo_filefor ((i=0;i<$thead_num;i++))doecho ""done >&4for i in $ipdoread -u4{expect <<EOFset timeout -1spawn scp -P 1000 $1 $i:$direxpect "(yes/no)?" {send "$answer\r"expect "Password:"send "$passwd\r"} "Password:" {send "$passwd\r"} "*host" {exit 1}expect eofEOFsleep 3echo "" >&4}&donewaitexec 4>&-
exit 0

转载于:https://blog.51cto.com/bronte/1440783

Linux下模拟多线程的并发并发shell脚本相关推荐

  1. linux脚本查看系统内存,二个linux下查看内存使用情况的shell脚本()

    摘要 腾兴网为您分享:二个linux下查看内存使用情况的shell脚本(),政务易,悦作业,优化大师,王者荣耀等软件知识,以及单向历app,优路教育app,kimoji,开关电源设计软件,皮皮高清影视 ...

  2. linux下开机自动启动,定时运行shell脚本

    Shell 脚本与window/dos 下的批处理相似,也就是用各类命令预先放入一个文件中,方便一次性执行的的一个程序文件,主要是方便管理员进行设置或者管理用. 一.shell脚本 在Linux下,我 ...

  3. Linux下为文件增加列的shell脚本

    场景:linux有份文件,需要增加一列序号来标记,通过shell脚本来实现. 步骤: 1)创建一份test.txt文件,内含一列,如下: bash-4.1$ cat test.txt a b c d ...

  4. linux下进行oracle的逻辑备份shell脚本

    1.创建一个脚本schema_exp.sh [oracle@localhost ~]$ ls afiedt.buf      hot_backup.sh        rman_backup.sh   ...

  5. linux下的ping脚本,Linux下检测服务器Ping值的Shell脚本

    这个月我们连续增加了4台国外服务器,让每台服务器的负载更低一些,这样网民和搜索引擎访问更顺畅,利于流量和广告收入的提升. 我今年早几个月曾经在网上找了一段检测Ping的代码,稍微改了一下适应我们的需要 ...

  6. Linux下的多线程编程

    1 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的Unix也支持线程的概念,但是在一个进程(process ...

  7. Linux下实现多线程的生产者消费者问题

    Linux下实现多线程的生产者消费者问题 一.原理的理解 生产者-消费者问题是一个经典的线程同步问题,该问题最早由Dijkstra提出,用以演示他提出的信号量机制.在同一个线程地址空间内执行的两个线程 ...

  8. linux模拟cpu过载,linux下模拟CPU占用100%小程序

    linux下模拟CPU占用100%小程序 来源:https://blog.csdn.net/lin434406218/article/details/54694900 一.单个核100% 代码kill ...

  9. [原创]手把手教你Linux下的多线程设计--Linux下多线程编程详解(一)

    本文可任意转载,但必须注明作者和出处. [原创]手把手教你Linux下的多线程设计(一)                                       --Linux下多线程编程详解 原 ...

  10. linux下tomcat脚本,Linux下重启多个 tomcat 服务的脚本(推荐)

    由于修改tomcat的配置文件或手动操作数据库数据后,tomcat的缓存和redis的缓存很严重,需要经常重启tomcat来释放缓存,经常就是手动重启. # 1.查找tomcat的进程ID ps -e ...

最新文章

  1. 西湖大学能招本科生了!首次确定 5 大本科专业
  2. linux 终端 含义,ubuntu终端中@前后的字符串含义及修改-布布扣-bubuko.com
  3. 解决jquery版本冲突问题
  4. Windows Server 2008 R2 DHCP服务器安装和配置案例
  5. 最优化理论与方法(part5)--函数和微分
  6. python 发送邮件附件及文字信息
  7. 超实用编程技术指南!为什么你还学不会一门编程语言?
  8. jqGrid数据列表和表单的列隐藏/显示
  9. 《SEM长尾搜索营销策略解密》一一2.10 小领域文化进入红利期
  10. 解决谷歌自带翻译不出现问题
  11. Android persistent机制
  12. 如何通过PTTools显示正在种子的PT网站
  13. 在浏览器输入localhost:3000显示需要新应用打开此localhost原因
  14. 增量学习简介(incremental learning)
  15. sap客户信贷_通过SAP ABAP接口修改客户信贷主数据
  16. fiddler重放请求
  17. Windows安裝SourceTree
  18. NOI 国家集训队论文集
  19. 如何读一个JavaWeb项目源代码
  20. MQ Reason code list

热门文章

  1. IDL | 语句练习
  2. JS学习总结(8)——数组
  3. 【空间分析】3 专题数据的数据分级
  4. html怎么设置自动音乐播放器,运用js教你轻松制作html音乐播放器
  5. 实习踩坑之路:一个ElasticSearchJava客户端的批量处理操作bulkIndexAsync引发的内存泄漏的血案
  6. 计算机网络(HTTP、TCP)的连接管理
  7. Mac配置adb笔记,彻底解决zsh: command not found: adb问题
  8. 如何从小白进化成 Apache Flink 技术专家?9节基础课程免费公开!
  9. FFmpeg总结(十三)用ffmpeg基于nginx实现直播功能,推流拉流
  10. ad怎么导入cad的外形尺寸_EPLAN与传统CAD的性能比较分析