shell多线程

Posted by ACRusher on August 20, 2016

shell多线程

线上排查日志经常需要查看多台机器的日志,为了提高排查效率便在团队内部开发了下面一个小工具。 当然,如果有更复杂的日志需求,可以通过flume+kafka+ES 的组合导入搜索引擎,之后通过搜索引擎实现高级搜索。


#! /bin/bash

#############################
# 批量查询日志工具
# author: zhouxiliang
#############################

help(){
cat << EOF
使用方法:  sh $0 -f hosts -e "script" -c 10
hosts   : ip文件
script  :每台服务器要执行的命令
-c 10   : 代表使用10个线程并发执行
EOF
exit 0
}

if [ $# -lt 6 ] ; then 
help
fi

#echo "$1 $2 $3 $4"

# 1. 获取要执行的机器 和 指令
HOSTS_FILE="";
SCRIPT="";
THREADS=10;
while getopts "e:f:c:" OPT;do   
    case $OPT in 
        f)
        HOSTS_FILE="$OPTARG"
        ;;     
        e)   
        SCRIPT="$OPTARG"
        ;;
        c)   
        THREADS=$OPTARG
        ;;     
        *)
          help
          exit;                
          ;;   
    esac   
done 


# 创建管道
tmp_file="/tmp/$$.fifo"
mkfifo $tmp_file
exec 6<>$tmp_file
rm $tmp_file

# 向管道输入线程
for ((i=0;i<$THREADS;++i)) ; do
echo
done >& 6

#读取要执行的机器ips
while read host ; do
hostarr=$hostarr" "$host
done < $HOSTS_FILE
#echo $hostarr

#多线程执行任务
for host in $hostarr ; do
read -u6
{
echo ">>>> $host start executing..."
ssh $host  "$SCRIPT"  2> /dev/null
echo >& 6
} &
done 

#等待后台线程结束
wait
#删除管道
exec 6>$-

exit 0


Creative Commons License
This work is licensed under a CC A-S 4.0 International License.