多线程单线程全部支持的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