You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu22.04重启后Tomcat因残留PID文件无法启动的方案咨询

系统重启后Tomcat残留PID文件启动失败问题及解决方案探讨

问题背景

系统重启后Tomcat因残留PID文件无法启动,执行version.sh输出如下:

/opt/tomcat/bin # ./version.sh
Using CATALINA_BASE:   /opt/tomcat
Using CATALINA_HOME:   /opt/tomcat
Using CATALINA_TMPDIR: /opt/tomcat/temp
Using JRE_HOME:        /usr/lib/jvm/temurin-17-jre-amd64
Using CLASSPATH:       /opt/tomcat/bin/bootstrap.jar:/opt/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:    -Xmx6000M -Xms6000M -XX:InitialCodeCacheSize=128M -XX:ReservedCodeCacheSize=128M ...
Using CATALINA_PID:    /opt/tomcat/work/catalina.pid
Server version: Apache Tomcat/10.1.28
Server built:   Aug 2 2024 15:14:43 UTC
Server number:  10.1.28.0
OS Name:        Linux
OS Version:     5.15.0-134-generic
Architecture:   amd64
JVM Version:    17.0.14+7
JVM Vendor:     Eclipse Adoptium

CATALINA_PID未指向/run/这类重启后自动清空的tmpfs路径,原因是systemctl服务以tomcat用户运行,该用户无权限创建/run/tomcat/目录。

现有方案及不足

目前已考虑以下几种方案,但均存在缺陷:

  • 将CATALINA_PID指向/run/tomcat/catalina.pid,提前创建tomcat用户可写的目录:依赖预配置,若目录被意外清理则问题复现
  • 重启后在Tomcat启动前删除/opt/tomcat/work/catalina.pid:无法区分正常运行的Tomcat和残留PID,可能误删正在运行的进程PID
  • 按照FHS和systemd标准重写启动流程:改动范围大,需适配现有环境,学习和迁移成本高
  • 重启后检查:若Tomcat已启用但未运行且PID文件修改时间早于系统运行时间,则删除PID并启动Tomcat:逻辑复杂,需处理多种异常场景

其他通用解决方案思路

1. 利用systemd的RuntimeDirectory特性

在tomcat的systemd服务文件中添加RuntimeDirectory=tomcat,systemd会自动在/run/下创建tomcat用户可写的目录,且系统重启后该目录会被自动清理。只需将CATALINA_PID配置为/run/tomcat/catalina.pid即可,无需手动维护目录权限和创建操作。

2. 启动脚本中添加PID有效性校验

修改Tomcat启动脚本(如startup.sh或自定义启动脚本),在启动前检查PID文件中的PID是否对应正在运行的Tomcat进程:

PID_FILE="/opt/tomcat/work/catalina.pid"
if [ -f "$PID_FILE" ]; then
    PID=$(cat "$PID_FILE")
    # 检查PID对应的进程是否存在,且是否为Tomcat进程
    if ps -p "$PID" -o cmd= | grep -q "tomcat"; then
        echo "Tomcat is already running with PID $PID"
        exit 1
    else
        echo "Removing stale PID file $PID_FILE"
        rm -f "$PID_FILE"
    fi
fi
# 执行Tomcat启动命令

这种方式能精准区分残留PID和正常运行的进程,避免误操作。

3. 配置Tomcat启动参数自动处理PID

通过Tomcat的启动参数-Dcatalina.pid指定PID文件路径,结合启动脚本的校验逻辑,确保只有当PID对应的进程不存在时才启动Tomcat。部分Tomcat版本的启动脚本已内置类似逻辑,可直接启用或调整。

4. 将PID文件放在用户临时目录

将CATALINA_PID指向/tmp/tomcat/catalina.pid,/tmp目录重启后会清空,且tomcat用户通常有权限创建该目录。需注意系统的tmp文件清理策略(如tmpfiles.d配置),避免运行中PID文件被定期清理工具误删。


内容的提问来源于stack exchange,提问作者maniac_on_moon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 20:04:54