分享一个在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

Linux下模拟多线程的并发并发shell脚本的更多相关文章

  1. Linux下定时备份MySQL数据库的Shell脚本

    Linux下定时备份MySQL数据库的Shell脚本   对任何一个已经上线的网站站点来说,数据备份都是必须的.无论版本更新还是服务器迁移,备份数据的重要性不言而喻.人工备份数据的方式不单耗费大量时间 ...

  2. 实用脚本----Linux下Jdk和Tomcat自动安装shell脚本总结

    系统环境为:ubuntu 14.04 一.JDK 自动安装脚本 jdk自动安装bash shell脚本,截止今天(2014/10/15)亲测可用: sudo su #切换到root权限 mkdir / ...

  3. Linux下自动还原MySQL数据库的Shell脚本

    创建shell脚本topjui_source.exp,内容如下: #!/usr/bin/expect spawn echo "###### running... ######" s ...

  4. 转 Linux下的GoldenGate的启动关闭Shell脚本(独立)

    用户想要用OGG进行同步数据,原来用的是Shareplex,至于为啥要换OGG,BulaBula一堆原因.....这不是我们要在意的事情,和客 户装完配置好OGG之后,测试中,客户提出要有个简单的启动 ...

  5. linux下使用ftp传递文件的shell脚本

    使用ftp传递文件,传递过程中防止对方取文件,后缀名为writing,传完后再改回来. #!/bin/bash dstpath=cnet ftpip="127.0.0.1" log ...

  6. linux下启动和终止JAVA程序shell脚本

    1.启动脚本start.sh #run application backgroud nohup java -jar chess-admin->& & #record the pr ...

  7. 【转】 Linux下的多线程编程

    作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/原文链接:http://www.cnblogs.com/gnuhpc/archive/2012/12/07/280 ...

  8. Linux下的多线程编程

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

  9. 【转】Linux下的多线程编程

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

随机推荐

  1. c#设计模式系类:亨元模式

    一.引言 在软件开发过程中,如果我们需要重复使用某个对象的时候,如果我们重复地使用new创建这个对象的话,这样我们在内存就需要多次去申请内存空间了,这样可能出现内存使用越来越多的情况,这样的问题是非常 ...

  2. jquery call cross-domain webapi owin self-host

    <!DOCTYPE HTML> <html LANG="cn"> <head> <meta name="viewport&quo ...

  3. hdu3089 Josephus again|快速约瑟夫环

    题目链接:戳我 貌似是高一昨天的考试题T2?????感觉挺好玩的就搞了搞qwqwq 其实是HDU上面的题啦.... 对于普通的约瑟夫问题,大概是n个人围成一个环,从1开始报数,数到k,那个人出队,最后 ...

  4. oppo手机永久打开USB调试模式

    现象:十分钟不使用就会自动关闭 usb 调试模式,重新打开还得输入验证码,真尼玛烦人. 方法: 数字拨号盘 输入 *#8011#  就可以永久打开.

  5. spring-第二章-AOP

    一,回顾 1.控制反转(IOC) 以前创建对象,由我们自己决定,现在我们把管理对象的声明周期权力交给spring; 2.依赖注入(DI) A对象需要B对象的支持,spring就把B注入给A,那么A就拥 ...

  6. Jupyter Notebook远程服务器配置[转]

    首先要生成密码,打开python终端. In [1]: from IPython.lib import passwd In [2]: passwd() Enter password: Verify p ...

  7. json "key" 注意

    json 的key只能是字符串 必须使用 双引号

  8. 逆向学习-DLL注入

    DLL注入技术,可以实现钩取API,改进程序,修复Bug. DLL注入指的是向运行中的其他进程强制插入特定的DLL文件. DLL注入命令进程自行调用LoadLibrary()API,加载用户指定的DL ...

  9. 在Grafana中可视化Jenkins管道结果

    这次我描述了一些稍微轻松的话题,与之前的一些帖子相比.就个人而言,我认为Grafana是一个非常酷的工具,用于可视化任何时间轴数据.事实证明,使用InfluxDB插件存储和可视化Jenkins构建结果 ...

  10. 多个tomcat一起运行

    1.默认为:8005 2.在D:\apache-tomcat-7.0.85\bin目录下,找到startup.bat,打开并修改. 3.在D:\apache-tomcat-7.0.85\bin目录下, ...