使用shell实现多线程(转)
Posted 小雨淅淅o0
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用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>&- #关闭文件描述符的写
以上是关于使用shell实现多线程(转)的主要内容,如果未能解决你的问题,请参考以下文章