zoukankan      html  css  js  c++  java
  • 使用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>&-                #关闭文件描述符的写
  • 相关阅读:
    [易学原创作品]QQ/MSN实现原理: C# UDP穿越NAT,UDP打洞,UDP Hole Punching,P2P
    工作流设计
    jquery 固定行列可编辑表格jfixed
    oracle 数据库实体生成工具
    c#做的查看sybase数据库表
    简单实用ORM框架
    Js 弹出框 返回值的两种常用方法
    数据结构 Jimmy
    js中的对象方法中this指向问题
    js中构造函数中this指向问题
  • 原文地址:https://www.cnblogs.com/xiaoyuxixi/p/14766664.html
Copyright © 2011-2022 走看看