设为首页 收藏本站
查看: 546|回复: 0

[经验分享] tomcat启停脚本高级版

[复制链接]

尚未签到

发表于 2018-12-3 11:16:25 | 显示全部楼层 |阅读模式
  由于需要对多个项目的多个应用进行管理,项目路径已经做了标准化部署,所以需要一个统一的脚本来管理所有的启停操作。
  里面附带日志、进程启动检查、批量状态查看等功能。
  以下为脚本相关内容,有些写法有点low,暂时没有想到更好的写法,有兴趣的可以留言
  

#!/bin/bash
#用途:本脚本用来管理tomcat节点的启动、停止、重启,以及查看tomcat节点的状态
#作者:张晓龙
#版本v1.0
#定义帮助说明函数,语法错误时返回使用说明
template(){
echo "Usage: $0 -n appname -i node action"
echo "-n appname:specifies the application name"
echo "-i node:specifie node number of application,it must followed by the -n option."
echo "If the node is all,all nodes of application will be operated. "
echo "action start/restart/stop:start or stop or restart the specified application node"
exit 101
}
#使用getopt获取应用名称、节点数,节点数可以为所有
RST=$(getopt -o n:i: -- "$@")
if [ $? -ne 0 ];then
    template
fi
eval set -- "$RST"
while [ -n "$1" ]
do
    case "$1" in
        -n)
            if [[ "$2" =~ -. ]];then #语法错误
                template;
            fi
            if [[ "$3" =~ -. ]];then
                APPNAME="$2";
            fi
            if [[ $(ps aux | grep java|grep ${APPNAME}|wc -l) == 0 ]];then
                template;
                shift 2
            fi;;
        -i)
            if [[ "$2" =~ -. ]];then#语法错误
                template
            fi
            if [[ "$3" =~ -. ]];then
                NODE="$2";
                #判断输入的节点,如果不是数字或者all,则进行报错并退出
                if [[ $(echo ${NODE}|grep -E '^[0-9]+$|all') == "" ]];then
                    echo "Error type!Argment with $1 must be init or all!"
                    template
                fi
                    shift 2
            fi;;
        --)
            shift;
            break;;
        *)
            template
            break;;
    esac
done
#全局初始化变量定义
init_args(){
    export DAY=$(date +%Y-%m-%d)
    export TIME=$(date +%H-%M-%S)
    export ALIVE=$(echo -e "\e[1;32m[ALIVE]\e[0m")
    export NULL=$(echo -e "\e[1;31m[N/A]\e[0m")
    export ERROR=$(echo -e "\e[1;31m[ERROR]\e[0m")
    export WARNING=$(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.log
    export LOG_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=60
    COMMAND=$*
    ${COMMAND} &
    COMMANDPID=$!
    ( sleep ${WAITFOR} ; echo '1' >temp.log && kill -9 ${COMMANDPID} >/dev/null 2>&1 ) &
    SLEEPPID=${PPID}
    wait ${COMMANDPID} >/dev/denull 2>&1
    kill ${SLEEPPID} > /dev/null 2>&1
}
check_err(){
    if [[ $(cat temp.log) == 1 ]];then
        rm temp.log
        log $*
    fi
}
start(){
    WORK_DIR=${HOME}/${APPNAME}
    if [[ "${NODE}" == all ]];then
        #检查是否有进程存活,如果有,做出判断,是杀掉后再启动,还是保留,只启动未启动的
        NODE_NUMS=$(ls ${WORK_DIR}|grep tomcat_${APPNAME}.*|wc -l)
        for i in $(seq 1 ${NODE_NUMS})
        do
            NODE_PID=$(ps aux | grep java|grep tomcat_${APPNAME}_$i|grep -v grep|awk '{print $2}')
            if [[ $(echo ${#NODE_PID}) != 0 ]];then
                read -p "${WARNING} Process ${APPNAME} node $i is running now!Do you want to restart it?(Y|N)" input
                case $input in
                    Y|y)
                        log " stop ${APPNAME} node is $i pid is ${NODE_PID}}"
                        kill -9 ${NODE_PID};;
                    n|N)
                        echo "${WARNING}: ${APPNAME} node $i pid ${NODE_PID} is already start!"
                        continue;;
                esac
            else
                cd ${WORK_DIR}/tomcat_${APPNAME}_$i/bin
                log " start ${APPNAME} node is $i pid is ${NODE_PID}"
                sh startup.sh > /dev/null 2>&1
                timeout_start tail -f ../logs/catalina.${DAY}.log | while read line
                do
                    TAIL_PID=$(ps aux | grep "tail -f ../logs/catalina.${DAY}.log"|awk '{print $2}')
                    if [[ $line =~ .*Server\ startup\ in.* ]];then
                        kill -9 ${TAIL_PID}
                    fi
                done
                check_err " ${ERROR} ${APPNAME} node $i start timeout!"
            fi
        done
#如果指定了节点,那么就判断节点是否是启动状态,如果启动,杀掉后再启动
    elif [[ ${NODE} != all ]];then
        NODE_PID=$(ps aux | grep tomcat_${APPNAME}_${NODE}|grep -v grep|awk '{print $2}')
        if [[ $(echo ${#NODE_PID}) != 0 ]];then
            read -p "${WARNING} Process ${APPNAME} node ${NODE_PID} is running now!Do you want to restart it?(Y|N)" input
            case $input in
            Y|y)
                log " stop ${APPNAME} node is ${NODE} pid is ${NODE_PID}}"
                kill -9 ${NODE_PID};;
            n|N)
                echo "${WARNING}: ${APPNAME} node ${NODE} pid ${NODE_PID} is already start!"
                continue;;
            esac
        else
            cd ${WORK_DIR}/tomcat_${APPNAME}_${NODE}/bin
            sh startup.sh > /dev/null 2>&1
            timout_start tail -f ../logs/catalina.${DAY}.log| while read line
            do
                TAIL_PID=$(ps aux | grep "tail -f ../logs/catalina.${DAY}.log"|awk '{print $2}')
                if [[ $line =~ .*Server\ startup\ in.* ]];then
                    kill -9 ${TAIL_PID}
                fi
            done
            check_err " ${ERROR} ${APPNAME} node ${NODE} start timeout!"
        fi
    fi
}
stop(){
    if [[ "${NODE}" == all ]];then
        NODE_PID=$(ps aux | grep java | grep tomcat_${APPNAME}| grep -v grep | awk '{print $2}')
        m=0
        for i in ${NODE_PID[@]}
        do
            m=$(expr $m+1)
            log " stop ${APPNAME} node $m pid is $i "
            kill -9 ${NODE_PID}
        done
    else
        NODE_PID=$(ps aux | grep java | grep tomcat_${APPNAME}_${NODE}|grep -v grep | awk '{print $2}')
        log " stop ${APPNAME} node ${NODE} pid is ${NODE_PID} "
        kill -9 ${NODE_PID}
    fi
}
status(){
    echo "System time is : ${DAY} ${TIME}"
    echo "${APPNAME} proccess status, node is ${NODE}"
    echo " ------------------------------------------------- "
    printf "|\t%-10s|\t%-10s|\t%-10s|\n" namepidstatus
    echo " ------------------------------------------------- "
    if [[ "${NODE}" == all ]];then
        NODES=$(ls ${HOME}/${APPNAME}|grep tomcat_${APPNAME}| wc -l)
        for i in $(seq 1 ${NODES})
        do
            cd ${HOME}/${APPNAME}
            NODE_NAME=$(ls tomcat_${APPNAME}_${i})
            NODE_PID=$(ps aux | grep java | grep ${NODE_NAME}|grep -v grep | awk '{print $2}')
            if [[ $(echo ${#NODE_PID}) == 0 ]];then
                NODE_STATUS=${NULL}
            else
            NODE_STATUS=${ALIVE}
            fi
            printf "|\t%-10s|\t%-10s|\t%-10s|\n" ${NODE_NAME} ${NODE_PID} ${NODE_STATUS}
        done
    else
        NODE_NAME=$(ls ${HOME}/${APPNAME}/tomcat_${APPNAME}_${NODE})
        NODE_PID=$(ps aux | grep java | grep ${NODE_NAME}|grep -v grep | awk '{print $2}')
        if [[ $(echo ${#NODE_PID}) == 0 ]];then
            NODE_STATUS='N/A'
        else
            NODE_STATUS='Alive'
        fi
        printf "|\t%-10s|\t%-10s|\t%-10s|\n"${NODE_NAME} ${NODE_PID} ${NODE_STATUS}
    fi
    echo " ------------------------------------------------- "
}
#变量引用
init_args
#执行动作
case $1 in
start)
    start;;
stop)
    stop;;
restart)
    stop;
    start;;
status)
    status;;
*)
    template;;
esac  





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-642755-1-1.html 上篇帖子: Java应用容器介绍以及tomcat优化实战 下篇帖子: tomcat使用jvm性能监控与zabbix使用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表