在 CentOS 中,使用 Catalina.sh 來管理 Tomcat 運行時,執行 Catalina.sh run 後產生的 Tomcat 進程無法使用 Catalina.sh stop -force 來關閉。如果 Catalina.sh 的預設內容用於配置 Tomcat 服務,則 /etc/init.d/tomcat stop 也將失效。
查看 Catalina.sh 文件後找到以下代碼,原來需要 stop 的話,需要 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