由于需要对多个项目的多个应用进行管理,项目路径已经做了标准化部署,所以需要一个统一的脚本来管理所有的启停操作。

里面附带日志、进程启动检查、批量状态查看等功能。

以下为脚本相关内容,有些写法有点low,暂时没有想到更好的写法,有兴趣的可以留言


#!/bin/bash#用途:本脚本用来管理tomcat节点的启动、停止、重启,以及查看tomcat节点的状态#作者:张晓龙#版本v1.0#定义帮助说明函数,语法错误时返回使用说明template(){echo"Usage:$0-nappname-inodeaction"echo"-nappname:specifiestheapplicationname"echo"-inode:specifienodenumberofapplication,itmustfollowedbythe-noption."echo"Ifthenodeisall,allnodesofapplicationwillbeoperated."echo"actionstart/restart/stop:startorstoporrestartthespecifiedapplicationnode"exit101}#使用getopt获取应用名称、节点数,节点数可以为所有RST=$(getopt-on:i:--"$@")if[$?-ne0];thentemplatefievalset--"$RST"while[-n"$1"]docase"$1"in-n)if[["$2"=~-.]];then#语法错误template;fiif[["$3"=~-.]];thenAPPNAME="$2";fiif[[$(psaux|grepjava|grep${APPNAME}|wc-l)==0]];thentemplate;shift2fi;;-i)if[["$2"=~-.]];then#语法错误templatefiif[["$3"=~-.]];thenNODE="$2";#判断输入的节点,如果不是数字或者all,则进行报错并退出if[[$(echo${NODE}|grep-E'^[0-9]+$|all')==""]];thenecho"Errortype!Argmentwith$1mustbeinitorall!"templatefishift2fi;;--)shift;break;;*)templatebreak;;esacdone#全局初始化变量定义init_args(){exportDAY=$(date+%Y-%m-%d)exportTIME=$(date+%H-%M-%S)exportALIVE=$(echo-e"\e[1;32m[ALIVE]\e[0m")exportNULL=$(echo-e"\e[1;31m[N/A]\e[0m")exportERROR=$(echo-e"\e[1;31m[ERROR]\e[0m")exportWARNING=$(echo-e"\e[1;33m[WARNING]\e[0m")[!-d${HOME}/scripts/logs];mkdir-p${HOME}/scripts/logs[!-d${HOME}/scripts/logs/tomcat.log];touch${HOME}/scripts/logs/tomcat.logexportLOG_FILE=${HOME}/scripts/logs/tomcat.log}#日志模块log(){DATE=$(date+"[%Y-%m-%d%H:%M:%S]")echo${DATE}$*echo${DATE}$*>>${LOG_FILE}}#tomcat启动定时器,低于60秒继续执行脚本,高于记录报错信息timeout_start(){WAITFOR=60COMMAND=$*${COMMAND}&COMMANDPID=$!(sleep${WAITFOR};echo'1'>temp.log&&kill-9${COMMANDPID}>/dev/null2>&1)&SLEEPPID=${PPID}wait${COMMANDPID}>/dev/denull2>&1kill${SLEEPPID}>/dev/null2>&1}check_err(){if[[$(cattemp.log)==1]];thenrmtemp.loglog$*fi}start(){WORK_DIR=${HOME}/${APPNAME}if[["${NODE}"==all]];then#检查是否有进程存活,如果有,做出判断,是杀掉后再启动,还是保留,只启动未启动的NODE_NUMS=$(ls${WORK_DIR}|greptomcat_${APPNAME}.*|wc-l)foriin$(seq1${NODE_NUMS})doNODE_PID=$(psaux|grepjava|greptomcat_${APPNAME}_$i|grep-vgrep|awk'{print$2}')if[[$(echo${#NODE_PID})!=0]];thenread-p"${WARNING}Process${APPNAME}node$iisrunningnow!Doyouwanttorestartit?(Y|N)"inputcase$inputinY|y)log"stop${APPNAME}nodeis$ipidis${NODE_PID}}"kill-9${NODE_PID};;n|N)echo"${WARNING}:${APPNAME}node$ipid${NODE_PID}isalreadystart!"continue;;esacelsecd${WORK_DIR}/tomcat_${APPNAME}_$i/binlog"start${APPNAME}nodeis$ipidis${NODE_PID}"shstartup.sh>/dev/null2>&1timeout_starttail-f../logs/catalina.${DAY}.log|whilereadlinedoTAIL_PID=$(psaux|grep"tail-f../logs/catalina.${DAY}.log"|awk'{print$2}')if[[$line=~.*Server\startup\in.*]];thenkill-9${TAIL_PID}fidonecheck_err"${ERROR}${APPNAME}node$istarttimeout!"fidone#如果指定了节点,那么就判断节点是否是启动状态,如果启动,杀掉后再启动elif[[${NODE}!=all]];thenNODE_PID=$(psaux|greptomcat_${APPNAME}_${NODE}|grep-vgrep|awk'{print$2}')if[[$(echo${#NODE_PID})!=0]];thenread-p"${WARNING}Process${APPNAME}node${NODE_PID}isrunningnow!Doyouwanttorestartit?(Y|N)"inputcase$inputinY|y)log"stop${APPNAME}nodeis${NODE}pidis${NODE_PID}}"kill-9${NODE_PID};;n|N)echo"${WARNING}:${APPNAME}node${NODE}pid${NODE_PID}isalreadystart!"continue;;esacelsecd${WORK_DIR}/tomcat_${APPNAME}_${NODE}/binshstartup.sh>/dev/null2>&1timout_starttail-f../logs/catalina.${DAY}.log|whilereadlinedoTAIL_PID=$(psaux|grep"tail-f../logs/catalina.${DAY}.log"|awk'{print$2}')if[[$line=~.*Server\startup\in.*]];thenkill-9${TAIL_PID}fidonecheck_err"${ERROR}${APPNAME}node${NODE}starttimeout!"fifi}stop(){if[["${NODE}"==all]];thenNODE_PID=$(psaux|grepjava|greptomcat_${APPNAME}|grep-vgrep|awk'{print$2}')m=0foriin${NODE_PID[@]}dom=$(expr$m+1)log"stop${APPNAME}node$mpidis$i"kill-9${NODE_PID}doneelseNODE_PID=$(psaux|grepjava|greptomcat_${APPNAME}_${NODE}|grep-vgrep|awk'{print$2}')log"stop${APPNAME}node${NODE}pidis${NODE_PID}"kill-9${NODE_PID}fi}status(){echo"Systemtimeis:${DAY}${TIME}"echo"${APPNAME}proccessstatus,nodeis${NODE}"echo"-------------------------------------------------"printf"|\t%-10s|\t%-10s|\t%-10s|\n"namepidstatusecho"-------------------------------------------------"if[["${NODE}"==all]];thenNODES=$(ls${HOME}/${APPNAME}|greptomcat_${APPNAME}|wc-l)foriin$(seq1${NODES})docd${HOME}/${APPNAME}NODE_NAME=$(lstomcat_${APPNAME}_${i})NODE_PID=$(psaux|grepjava|grep${NODE_NAME}|grep-vgrep|awk'{print$2}')if[[$(echo${#NODE_PID})==0]];thenNODE_STATUS=${NULL}elseNODE_STATUS=${ALIVE}fiprintf"|\t%-10s|\t%-10s|\t%-10s|\n"${NODE_NAME}${NODE_PID}${NODE_STATUS}doneelseNODE_NAME=$(ls${HOME}/${APPNAME}/tomcat_${APPNAME}_${NODE})NODE_PID=$(psaux|grepjava|grep${NODE_NAME}|grep-vgrep|awk'{print$2}')if[[$(echo${#NODE_PID})==0]];thenNODE_STATUS='N/A'elseNODE_STATUS='Alive'fiprintf"|\t%-10s|\t%-10s|\t%-10s|\n"${NODE_NAME}${NODE_PID}${NODE_STATUS}fiecho"-------------------------------------------------"}#变量引用init_args#执行动作case$1instart)start;;stop)stop;;restart)stop;start;;status)status;;*)template;;esac