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

Ubuntu 22.04下Systemctl启动Tomcat部署WAR后无法访问问题

Tomcat 8.5在Ubuntu 22.04下systemctl启动异常问题排查与解决

问题现象

  • 未部署WAR包时,startup.sh和systemctl均可正常启动Tomcat并访问localhost:8080
  • 部署应用WAR包后,systemctl显示Tomcat处于active状态,但无法访问localhost:8080;手动执行startup.sh则可正常访问localhost:8080及localhost:8080/myapp
  • 日志差异:手动启动的catalina.out包含Configuring Spring Security Core ... ... finished configuring Spring Security Core记录,systemctl启动时无该条目
  • 已排除权限问题:执行sudo -u tomcat bash -c '/opt/tomcat/bin/startup.sh'可正常启动并访问应用

当前systemd服务配置

[Unit]
Description=Tomcat 8.5
After=syslog.target network.target

[Service]
Type=forking

User=tomcat
Group=tomcat


Environment="JAVA_HOME=/home/myuser/.sdkman/candidates/java/8.0.282.hs-adpt"
Environment="JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom"
Environment="CATALINA_PID=/opt/tomcat/temp/tomcat.pid"
Environment="CATALINA_BASE=/opt/tomcat"
Environment="CATALINA_HOME=/opt/tomcat"
Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC"

ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh

#RestartSec=10
#Restart=always

[Install]
WantedBy=multi-user.target

journalctl错误日志

An ExecStart= process belonging to unit tomcat.service has exited. 
░░░░ The process' exit code is 'exited' and its exit status is 1.
Aug 21 14:44:49 myMachine systemd[1]: tomcat.service: Failed with result 'exit-code'.
░░ Subject: Unit failed ░░ Defined-By: systemd ░░ 
Support: http://www.ubuntu.com/support 
░░░░ The unit tomcat.service has entered the 'failed' state with result 'exit-code'. 
Aug 21 14:44:49 myMachine systemd[1]: Failed to start Tomcat - instance . 
░░ Subject: A start job for unit tomcat.service has failed ░░ 
Defined-By: systemd ░░ Support: http://www.ubuntu.com/support
░░░░ A start job for unit tomcat.service has finished with a failure. ░░░░ 
The job identifier is 14172 and the job result is failed.

解决方案

修改systemd服务配置

替换为以下配置:

[Unit]
Description=Tomcat 8.5
After=syslog.target network.target

[Service]
Type=simple
User=tomcat
Group=tomcat

# 改用系统级JDK路径,确保tomcat用户可访问
Environment="JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64"
Environment="JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom"
Environment="CATALINA_BASE=/opt/tomcat"
Environment="CATALINA_HOME=/opt/tomcat"
Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC"

# 直接运行catalina.sh而非startup.sh,避免fork进程导致systemd误判
ExecStart=/opt/tomcat/bin/catalina.sh run
ExecStop=/opt/tomcat/bin/shutdown.sh

Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

配置说明

  1. Type=simple:放弃forking模式,使用simple配合catalina.sh run让Tomcat在前台运行,systemd能准确监控进程状态,避免误判服务启动完成。
  2. JAVA_HOME路径调整:原配置使用的sdkman路径属于myuser用户,tomcat用户可能无访问权限,改用系统级OpenJDK路径可避免权限问题,确保JDK正常加载。
  3. 启动命令修改:直接调用catalina.sh run替代startup.sh,消除fork进程带来的状态检测问题,同时让systemd能捕获Tomcat的完整日志。

操作步骤

  1. 停止当前Tomcat服务:sudo systemctl stop tomcat.service
  2. 备份原服务文件:sudo cp /etc/systemd/system/tomcat.service /etc/systemd/system/tomcat.service.bak
  3. 替换为新的服务配置内容
  4. 重新加载systemd配置:sudo systemctl daemon-reload
  5. 启动Tomcat服务:sudo systemctl start tomcat.service
  6. 查看服务状态:sudo systemctl status tomcat.service

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 18:04:58