SHELL多线程和单线程脚本框架(简单易上手)

多线程单线程全部支持的shell脚本框架.

简单易上手,自己定义TO_DO函数即可.

LIST可以标准化为一个列表文件,以供并发执行需要.

./xx.sh   $host shell  "ls -l"  -f=10  #示例以10线程并发执行....

#!/bin/bash

#多线程执行
function More_Thread(){
  Tmpfifo="${ScriptDir}/tm1"
  mkfifo ${Tmpfifo}
  exec 888<>${Tmpfifo}
  rm -f ${Tmpfifo}
  for ((i=1;i<=${Thread};i++)); do
    echo >&888
  done
  for j in ${List}; do
    read -u888
    {
         OUTPUT=`TO_DO`
     echo "${OUTPUT}"     
     echo >&888
    }&
  done
  wait
  exec 888>&-
  exec 888<&-
}
#单线程顺序执行
function Single_Thread(){
  for j in ${List}; do
    TO_DO
  done
}

#检查线程参数
function Check_Thread(){
  if [[ "${Thread}" -gt 1 ]];then
    echo "<当前并发 ${Thread} 线程执行!>"
    if [[ "${Output}" == "list" ]];then
      More_Thread >/dev/null
      Back_result 
    else
      More_Thread 
    fi
    OutputCmd=">/dev/null"
  else
    Thread=1
    OutputCmd=""
    Single_Thread
  fi
}

TO_DO(){
  Sid=`echo "${j}"|cut -f2 -d\|`
  Sip=`echo "${j}"|cut -f3 -d\|`
  Sport=`echo "${j}"|cut -f4 -d\|`
  SSH="ssh -o StrictHostKeyChecking=no -o ConnectTimeout=3 "
  Normal_log="${Resultlogdir}/${Sid}_${Sip}_${TimeNow}.log"
  Error_log="${Resultlogdir}/${Sid}_${Sip}_${TimeNow}_error.log"
  HostHeader="${Sid}[${Sip}:${Sport}]"
  TimeStart=`date  +%F\ %T `
  echo  -e "${RED}ERROR!!!  命令未执行成功,请检查" >${Error_log}
  echo  -e "${WHITE}(${TimeStart})${End}==== ${GREEN}${HostHeader}${End} ====" |tee -i ${Normal_log}

  if [[ "${FUNC_CMD}" == "Shell_CMD" ]];then
    ${SSH} ${Sip} -p ${Sport} "${CMD}" 2>>${Error_log}|tee -i ${Normal_log}

  elif [[ "${FUNC_CMD}" == "SSHlogin_CMD" ]];then 
    ${SSH} -p ${Sport} ${Sip}
  fi

  echo  -ne "${End}" >>${Error_log}
  Checkfail=`egrep -cv 'From ssh|master|令未执行成功,请检查|^$'  ${Error_log}`
  if [[ "${Checkfail}" -gt 1 ]];then
    cat ${Error_log}
  fi
}

Host=$1   #Host列表,如: group|vm|1.1.1.1|22
Action=$2
Cmd1=$3  #执行内容
Cmd2=$4  #线程数
ScriptDir=$(cd `dirname $0`; pwd)
RED='\e[1;31m';GREEN='\e[1;32m';YELLOW='\e[1;33m';WHITE='\e[1;37m';End='\033[0m'
TimeNow=`date +%F%T|sed 's/-//g;s/://g'`
Resultlogdir="${ScriptDir}/tmp/more_thread_log"
mkdir ${Resultlogdir} -p

case ${Action} in
    shell)
        CMD=`echo "${Cmd1}"|sed 's/-c=//g'`
        Thread=`echo "${Cmd2}"|sed 's/-f=//g'`        
        FUNC_CMD="Shell_CMD"
        Check_Thread      
    ;;
    login)
        FUNC_CMD="SSHlogin_CMD" 
        Check_Thread
    ;;
    *)
      echo -e "匹配组|主机名|IP|PORT\n${List}\n"|column -t -s "|"
      echo -e '\n./gamessh $host shell/scripts/sent_file/reciv_file/show/rsync_host $cmd -f=$thread'
esac

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值