shell实现多线程操作

业务需求

	目前平台有近千台服务器,由于特殊情况,需要时不时的收集获取相关服务器
信息,此处暂时不考虑ansible,saltstack等自动化工具,让临时使用shell
实现,正常都是直接使用循环的方式进行操作,但耗时比较久,要求提高效率,
考虑使用多线程操作

实现逻辑

可以简单理解为如下步骤:
1.想要实现shell的并发,无非就是把循环体里面的指令使用&放入后台进行;
2.使用wait指令等待循环体执行完后,进行下一个循环;
3.由于并发过多,会导致系统出现异常情况,所以此处用到队列来控制线程数目;

直接上脚本

#!/bin/bash

start_time=`date +%s`
[ -e /tmp/fd1 ] || mkfifo /tmp/fd1
exec 2<>/tmp/fd1		#创建文件描述符,以读(<)写(>)的方式关联管道文件
#rm -rf /tmp/fd1

for ((i=1;i<=5;i++))
do
    echo >&2		#&2代表引用文件描述符3,这条命令代表往管道里面放入了一个"令牌"
done

for ip in `mysql -hip -Pport -uuser -ppwd -e 'SELECT dev.ext_ip FROM 		openser.sys_cfg_device_info dev;'|grep 10|sort -t"." -k3,3n -k4,4n` #从数据库中取值
do
    read -u2		#代表从管道中读取一个令牌
{
    ssh $ip 'date +%s' >>/dev/null
    if [ $? -eq 0 ];then
            echo $ip >>ipok
    fi
    echo >&2		#代表我这一次命令执行到最后,把令牌放回管道

}&
done
wait

#stop_time=`date +%s`
#echo "TIME:`expr $stop_time - $start_time`"
exec 2<&-				#关闭文件描述符的读
exec 2>&-				#关闭文件描述符的写
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值