您的位置:首页 > 运维架构 > Tomcat

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

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

Nov 10, 2017 2:38:35 PM org.apache.coyote.AbstractProtocol pause
INFO: Pausing ProtocolHandler ["http-nio-8080"]

Nov 10, 2017 2:38:35 PM org.apache.catalina.core.StandardService stopInternal
INFO: 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 clearReferencesThreads
SEVERE: 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 stop
INFO: Stopping ProtocolHandler ["http-nio-8080"]
Nov 10, 2017 2:38:35 PM org.apache.coyote.AbstractProtocol destroy
INFO: 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=$1
BRANCH_NAME=$2
PROFILE=$3

BASE_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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  脚本 服务器 ssh