通过systemd启动Tomcat失败,如何获取Java日志排查问题?
以下是catalina.sh中启动应用的代码片段:
eval $_NOHUP "\"$_RUNJAVA\"" "\"$CATALINA_LOGGING_CONFIG\"" $LOGGING_MANAGER "$JAVA_OPTS" "$CATALINA_OPTS" \ -D$ENDORSED_PROP="\"$JAVA_ENDORSED_DIRS\"" \ -classpath "\"$CLASSPATH\"" \ -Dcatalina.base="\"$CATALINA_BASE\"" \ -Dcatalina.home="\"$CATALINA_HOME\"" \ -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \ org.apache.catalina.startup.Bootstrap "$@" start \ >> "$CATALINA_OUT" 2>&1 "&"
排查方案
1. 手动执行启动命令,实时查看输出
切换到Tomcat运行用户(例如tomcat),直接执行启动核心命令(去掉nohup和后台运行的&),错误信息会直接打印在控制台:
$_RUNJAVA "$CATALINA_LOGGING_CONFIG" $LOGGING_MANAGER "$JAVA_OPTS" "$CATALINA_OPTS" \ -D$ENDORSED_PROP="$JAVA_ENDORSED_DIRS" \ -classpath "$CLASSPATH" \ -Dcatalina.base="$CATALINA_BASE" \ -Dcatalina.home="$CATALINA_HOME" \ -Djava.io.tmpdir="$CATALINA_TMPDIR" \ org.apache.catalina.startup.Bootstrap start
这种方式能快速定位启动失败原因,比如依赖缺失、端口占用、权限不足等。
2. 修改systemd服务配置,捕获完整日志
编辑Tomcat的systemd服务文件(通常路径为/etc/systemd/system/tomcat.service),添加或修改以下配置项:
StandardOutput=journal+console StandardError=journal+console
执行以下命令重新加载配置并重启服务:
systemctl daemon-reload systemctl restart tomcat.service
之后用journalctl -u tomcat.service -f查看日志,就能看到Java进程的标准输出和错误信息,不受catalina.out写入问题影响。
3. 检查systemd环境变量与脚本权限
- 确保
catalina.sh有可执行权限:chmod +x $CATALINA_HOME/bin/catalina.sh - 很多启动失败是因为systemd的运行环境和用户环境不一致,需在service文件中明确设置核心环境变量:
Environment="JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk" Environment="CATALINA_HOME=/opt/tomcat9" Environment="CATALINA_BASE=/opt/tomcat9"
4. 强制Java生成启动日志
在JAVA_OPTS中添加日志参数,让Java直接输出启动细节到指定文件:
JAVA_OPTS="$JAVA_OPTS -Xlog:gc*,class+load=info:file=/opt/tomcat9/logs/java-startup.log:time,level,tags"
重启服务后,查看/opt/tomcat9/logs/java-startup.log,里面包含JVM启动参数、类加载情况等详细信息。
5. 检查日志目录权限
确认Tomcat运行用户对日志目录有读写权限:
chown -R tomcat:tomcat /opt/tomcat9/logs chmod -R 755 /opt/tomcat9/logs
权限不足会导致进程无法写入catalina.out,进而出现日志为空的情况。
内容的提问来源于stack exchange,提问作者DavidDunham
相关产品推荐
相关产品推荐

