自动发布脚本导致的Tomcat意外退出

来源:互联网 发布:java工程师月薪 编辑:程序博客网 时间:2024/06/05 09:49

最近公司项目的Dev环境要自己维护,为了避免麻烦,写了一个发布脚本,但是发现每次关闭和服务器的SSH连接后,Tomcat就意外退出,查看日志发现最后退出有如下几行日志:

Nov 10, 2017 2:38:35 PM org.apache.coyote.AbstractProtocol pauseINFO: Pausing ProtocolHandler ["http-nio-8080"]Nov 10, 2017 2:38:35 PM org.apache.catalina.core.StandardService stopInternalINFO: Stopping service Catalina[INFO][2017-11-10 14:38:35] org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:960) Closing WebApplicationContext for namespace 'Dispatcher-servlet': startup date [Fri Nov 10 14:37:53 CST 2017]; parent: Root WebApplicationContext    [INFO][2017-11-10 14:38:35] org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:960) Closing Root WebApplicationContext: startup date [Fri Nov 10 14:37:52 CST 2017]; root of context hierarchy    Nov 10, 2017 2:38:35 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreadsSEVERE: The web application [/] appears to have started a thread named [FileWatchdog] but has failed to stop it. This is very likely to create a memory leak.Nov 10, 2017 2:38:35 PM org.apache.coyote.AbstractProtocol stopINFO: Stopping ProtocolHandler ["http-nio-8080"]Nov 10, 2017 2:38:35 PM org.apache.coyote.AbstractProtocol destroyINFO: Destroying ProtocolHandler ["http-nio-8080"]

最开始怀疑是 OOM 问题,排查代码没有发现相关问题,JVM配置OOM后转存堆内存快照,也没有发现问题,后来发现规律是每次关闭SSH连接一会儿后Tomcat即关闭,度娘后发现如下文章:

tomcat进程意外退出的问题分析

-XX:+HeapDumpOnOutOfMemoryError  -XX:HeapDumpPath=\data\heap\

解决方案

在脚本开始添加 set -m,使用监视模式。

问题原因

  • SSH关闭后,操作系统kill掉脚本;
  • Java进程挂在了脚本进程下面;

修改后的脚本

修改后的发布脚本:

#!/bin/sh# author qiesai##调用格式:base-war-deploy-tools.sh proName branchName profile ##命名规则:proName作为back、release、war的名称存在,要保持一致PRO_NAME=$1BRANCH_NAME=$2PROFILE=$3BASE_DIR=`pwd`CODE_DIR="/data/code/${PRO_NAME}/"RELEASE_DIR="/data/release/"BACKUP_DIR="/data/backup/"WAR_NAME="${PRO_NAME}.war";function stopTomcat(){    echo "_______________________________"    echo "stop tomcat"    TOMCAT_PID=`ps -ef|grep tomcat | grep -v 'grep\|tail' | awk '{print $2}'`    if [ -n "$TOMCAT_PID" ]; then        echo "tomcat is running : ${TOMCAT_PID} , will stop it"        kill -9 $TOMCAT_PID    fi    COUNT=0      while [ $COUNT -lt 1 ]; do              echo -e ".\c"          sleep 1        COUNT=1        PID_EXIST=`ps --no-heading -p $TOMCAT_PID`          if [ -n "$PID_EXIST" ]; then              COUNT=0            break        fi     done    echo ""    echo "stop tomcat succes"}function buildProject(){    source /etc/profile    echo "_______________________________"    echo "pull git code"    cd $CODE_DIR    git branch -q $BRANCH_NAME    git checkout $BRANCH_NAME    git pull origin $BRANCH_NAME    echo "_______________________________"    echo "buil project"    echo `/data/maven/maven/bin/mvn clean package -P${PROFILE}`    echo "buil finish"}function releaseWar(){    echo "_______________________________"    echo "deploy war"    cd $RELEASE_DIR    mv -f ./$WAR_NAME $BACKUP_DIR$WAR_NAME    #注意不要 rm -rf /*也不要 cd到/下    rm -rf *    mv -f $CODE_DIR/target/$WAR_NAME ./$WAR_NAME     #set -m是解决Tomcat关闭的关键点。    set -m    nohup /data/tomcat/bin/startup.sh &    echo "deploy success"}function main(){    if [ -z "$PRO_NAME" ]; then        echo "please input project name"        exit;    fi    if [ -z "$BRANCH_NAME" ]; then        echo "please input a git branch name"        exit;    fi    if [ -z "$PROFILE" ]; then        echo "please choose a profile"        exit;    fi    echo "=====================begin deploy====================="    buildProject;    stopTomcat;    releaseWar;    echo "=====================deploy succ====================="    tail -f /data/tomcat/logs/catalina.out}main;