banner
李大仁博客

李大仁博客

天地虽大,但有一念向善,心存良知,虽凡夫俗子,皆可为圣贤。

Tomcat进程无法正常停止的问题

在 CentOS 中,使用 Catalina.sh 来管理 Tomcat 运行时,运行 Catalina.sh 后生成的 Tomcat 进程无法通过 Catalina.sh stop -force 命令关闭。如果使用 Catalina.sh 的默认配置来配置 Tomcat 服务,/etc/init.d/tomcat stop 命令也将无效。

查看 Catalina.sh 文件后找到以下代码,原来需要停止 Tomcat 时,需要配合 CATALINA_PID 文件。Catalina.sh 的第 468 行:

if [ ! -z "$CATALINA_PID" ]; then
if [ -f "$CATALINA_PID" ]; then
if [ -s "$CATALINA_PID" ]; then
kill -0 `cat "$CATALINA_PID"` >/dev/null 2>&1
if [ $? -gt 0 ]; then
echo "找到 PID 文件,但未找到匹配的进程。停止操作已中止。"
exit 1
fi
else
echo "PID 文件为空,已被忽略。"
fi
else
echo "\$CATALINA_PID 已设置,但指定的文件不存在。Tomcat 是否正在运行?停止操作已中止。"
exit 1
fi
fi

关于 CATALINA_PID 的说明,可以在 Catalina.sh 的第 89 行找到:

# CATALINA_PID (可选) 包含 Catalina 启动 Java 进程的 PID 的文件路径

当使用 start (fork) 时#

解决办法是,在配置 Catalina.sh 的环境变量时添加 CATALINA_PID 变量。

#创建 PID 文件
touch /usr/local/tomcat/logs/tomcat.pid

在 /etc/init.d/tomcat 文件头部增加环境变量配置#

sed -i '1a\. /etc/init.d/functions' /etc/init.d/tomcat
sed -i '2a\:' /etc/init.d/tomcat
sed -i '3a\JAVA_HOME=/usr/local/jdk' /etc/init.d/tomcat
sed -i '4a\CATALINA_BASE=/usr/local/tomcat' /etc/init.d/tomcat
sed -i '5a\CATALINA_HOME=/usr/local/tomcat' /etc/init.d/tomcat

添加 PID 文件位置#

sed -i ‘6a\CATALINA_PID=/usr/local/tomcat/logs/tomcat.pid' /etc/init.d/tomcat

最后,当使用 Catalina.sh 单独运行 Tomcat 时,建议在 $CATALINA_HOME/bin 目录下新建 setenv.sh 文件来实现。

参考链接:http://lovesoo.org/tomcat-process-fails-to-stop-problem-solving.html

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。