Linux下模拟多线程的并发并发shell脚本

摘要:
共享一个在Linux中模拟多线程的并发脚本。使用此脚本,您可以同时在定义数量的服务器上批量执行相关命令。与普通的for/while循环相比,它非常高效,只能按顺序逐个执行。它在管理大量服务器时非常实用。下面的脚本功能是通过scp将更新包传输到数千台服务器。脚本运行后,50个scp进程将在后台/bin/baship=`catiplist中同时将包传输到服务器。Txt|grep v“#”|awk“{print$1}”`dir='/usr/local/src'answer=“yes”#定义是/否答案变量passwd=“123456”#服务器密码thead_num=50tmp_file=“/tmp/$$.fifo”mkfifo$tmp_fileexec4$tmp_ffilerm-f$tmp_file fordocho“done˃&4forin$ipdoread-u4{expect˂˂EOFsettimeout-1spawnscp-P1000$1$i:$dir期望”?

 分享一个在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 "
                        expect "Password:"
                        send "$passwd "
                        } "Password:" {send "$passwd "} "*host" {exit 1}
                        expect eof
                        EOF
                        
                        sleep 3
                        echo "" >&4
                }&
done
wait
exec 4>&-
exit 0

免责声明:文章转载自《Linux下模拟多线程的并发并发shell脚本》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇实验1:SDN拓扑实践Android开发人员必备的10 个开发工具下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Shell脚本中时间处理

Shell脚本中时间处理 1.脚本内容 #!/bin/bash #环境变量 #设置环境变量和sql文件格式相符 source /etc/profileexport LD_LIBRARY_PATH="/usr/lib/oracle/12.1/client64/lib" export NLS_LANG="AMERICAN_AMERICA.ZHS16GBK" e...

性能测试之nmon对linux服务器的监控

大家都知道在做性能测试的时候,需要监控服务器的资源情况,而大多数服务器是Linux系统,网上资料嘿多,这里汇总介绍下Nmon监控工具: ---------------------------------------------------------------------------------------------------------------...

实验二:Linux下Xen环境的安装

实验名称:   Linux下Xen环境的安装(centOS7) 实验环境:   本次实验基本是在centOS7的环境下完成,系统内核和系统版本如下: 实验要求:   为centOS7的环境下安装Xen的平台,能够正常使用Xen下的轻量级管理工具--xl 实验配置:   1、查看虚拟机是否启动硬件辅助虚拟化技术(HVM)     一般intel支持的硬件辅...

android adb常用指令

Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器的状态。 可以通过下列几种方法加入adb: 在设备上运行shell命令 通过端口转发来管理模拟器或设备 从模拟器或设备上拷贝来或拷贝走文件 下面对adb进行了介绍并描述了常见的使用. Contents 概要 发出adb命令 查询模拟器/设备实例 给特定的模拟器/设备...

linux ftp 命令详解

ftp命令是Internet用户使用最频繁的命令之一,不论是在DOS还是UNIX操作系统下使用FTP,都会遇到大量的FTP内部命令,熟悉并灵活应 用FTP的内部命令,可以大大方便使用者,对于现在拨号上网的用户,如果ISP提供了shell可以使用nohup,那么ftp将是你最省钱的上 download方式,ftp的命令行格式为:ftp -v -d -i -n...

Uboot--Linux参数传递--ATAG【转】

转自:https://blog.csdn.net/gx19862005/article/details/28596539 Linux内核源码分析--内核启动命令行的传递过程(Linux-3.0 ARMv7) Linux内核在启动的时候需要一些参数,以获得当前硬件的信息或者启动所需资源在内存中的位置等等。这些信息可以通过bootloader传递给内核,比较常...