systemctl 启动后立即停止 Tomcat 服务

systemctl 启动后立即停止 Tomcat 服务

我首先在 StackOverflow 上询问了这个问题,但似乎这个网站更适合。

我正在设置一个 Web 应用环境来运行 Java 应用。该环境应该是:

  • AWS EC2 Ubuntu 18
  • Java 8
  • Tomcat 9

我启动了一个 EC2 实例并安装了 java,然后按照本指南设置 Tomcat: https://www.digitalocean.com/community/tutorials/install-tomcat-9-ubuntu-1804

现在,尝试启动/重新启动 Tomcat 服务时会出现问题systemctl。这是我在检查 systemctl 日志时看到的内容:

12 月 19 日 13:35:25 ip-10-165-10-74 systemd[1]: tomcat.service: 服务延迟时间已过,正在安排重新启动。
12 月 19 日 13:35:25 ip-10-165-10-74 systemd[1]: tomcat.service: 计划重启作业,重启计数器为 5。
12 月 19 日 13:35:25 ip-10-165-10-74 systemd[1]: 已停止 Apache Tomcat Web 应用程序容器。
12 月 19 日 13:35:25 ip-10-165-10-74 systemd[1]: 正在启动 Apache Tomcat Web 应用程序容器...
12月19日 13:35:25 ip-10-165-10-74 startup.sh[1705]: Tomcat 已启动。
12 月 19 日 13:35:25 ip-10-165-10-74 systemd[1]:已启动 Apache Tomcat Web 应用程序容器。
12 月 19 日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: 2018 年 12 月 19 日下午 1:35:26 org.apache.catalina.startup.Catalina stopServer
12 月 19 日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: 严重:无法连接 [localhost:8005] (基本端口 [8005] 和偏移量 [0])。Tomcat 可能未运行。
12 月 19 日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: 2018 年 12 月 19 日下午 1:35:26 org.apache.catalina.startup.Catalina stopServer
12 月 19 日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: 严重:停止 Catalina 时出错
12 月 19 日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: java.net.ConnectException: 连接被拒绝 (连接被拒绝)
12 月 19 日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: 在 java.net.PlainSocketImpl.socketConnect(Native Method)
12 月 19 日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: 在 java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
12 月 19 日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: 在 java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
12 月 19 日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: 在 java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
12 月 19 日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: 在 java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
12 月 19 日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: 在 java.net.Socket.connect(Socket.java:589)
12 月 19 日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: 在 java.net.Socket.connect(Socket.java:538)
12 月 19 日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: 在 java.net.Socket。(Socket.java:434)
12 月 19 日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: 在 java.net.Socket。(Socket.java:211)
12月19日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: 在 org.apache.catalina.startup.Catalina.stopServer(Catalina.java:513)
12 月 19 日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
12 月 19 日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
12 月 19 日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
12 月 19 日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: 在 java.lang.reflect.Method.invoke(Method.java:498)
12 月 19 日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: 在 org.apache.catalina.startup.Bootstrap.stopServer(Bootstrap.java:403)
12 月 19 日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: 在 org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:497)
12 月 19 日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: 停止命令失败。尝试通过 OS 信号发出停止进程的信号。
12月19日 13:35:27 ip-10-165-10-74 shutdown.sh[1725]: Tomcat 已停止。

systemd 配置:

[单元]
描述=Apache Tomcat Web 应用程序容器
之后=网络.目标

[服务]
类型=分叉

环境=JAVA_HOME=/usr/lib/java/jdk1.8.0_191
环境=CATALINA_PID=/opt/tomcat/temp/tomcat.pid
环境=CATALINA_HOME=/opt/tomcat
环境=CATALINA_BASE=/opt/tomcat
环境='CATALINA_OPTS=-Xms256M -Xmx512M -server -XX:+UseParallelGC'
环境='JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom'

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

用户=tomcat
组=tomcat
掩码=0007
重启安全=10
重启=总是

[安装]
WantedBy=多用户.目标

据我了解,这里的问题是 Tomcat 无法连接到 8005 端口来监听关机命令。

但是,我在EC2安全组控制台中打开了这个端口: 8005 127.0.0.1/32

另一件奇怪的事情是,重新启动 ec2 实例时 Tomcat 启动正常,但无法重新启动并抛出如上所述的异常。

这里可能存在什么问题?如何检查端口 8005 是否确实打开?

===========

好吧,我取得了一些进展,我发现 Tomcat 似乎运行良好。startup.sh运行正常 - 您可能会在日志中看到这一点 - 它回显“Tomcat 已启动”。这是 中的最后一行catalina.sh start。但是,我不明白为什么systemctl在启动服务后立即尝试停止服务。它发送catalina.sh stop命令。

答案1

感谢@MichaelHampton 的精彩文章: https://jdebp.eu/FGA/systemd-house-of-horror/tomcat.html

它解释了我读过的教程(以及大量其他复制粘贴的教程)中建议的典型安装可能出现的问题。我无法弄清楚问题出现的原因。也许是 catalina.sh、startup.sh 等引入的所有层的问题。

所以基本上,我重写了 systemd 配置脚本并且它开始工作了。

答案2

我遇到了完全相同的问题。只是我使用的是 Amazon Lightsail。也许 Amazon 配置其 Ubuntu 机器的方式以及所述创建 Tomcat 服务的方式存在问题。我在自己设置的本地 Ubuntu 机器上使用所述方式,并且运行良好。

我读了 @michael-hampton 的文章,并使用了那里描述的方法。我是一个 Linux 新手,我发现在使用它时遇到了一些问题。我在这里包含了我最终得到的文件,这样其他遇到此问题的 Linux 新手可能会更容易上手。我的 Tomcat 安装在 /opt/tomcat,这些是我最终得到的文件:

/etc/systemd/system/tomcat.service

[Unit]
Description=Apache Tomcat Web Application Container
After=network.target


[Service]
User=tomcat
Group=tomcat
UMask=0007

EnvironmentFile=/etc/default/tomcat
ExecStart=/usr/bin/env ${JAVA_HOME}/bin/java \
$JAVA_OPTS $CATALINA_OPTS \
-classpath ${CLASSPATH} \
-Dcatalina.base=${CATALINA_BASE} \
-Dcatalina.home=${CATALINA_HOME} \
-Djava.endorsed.dirs=${JAVA_ENDORSED_DIRS} \
-Djava.io.tmpdir=${CATALINA_TMPDIR} \
-Djava.util.logging.config.file=${CATALINA_BASE}/conf/logging.properties \
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager \
org.apache.catalina.startup.Bootstrap \
start

ExecStop=/usr/bin/env ${JAVA_HOME}/bin/java \
$JAVA_OPTS $CATALINA_OPTS \
-classpath ${CLASSPATH} \
-Dcatalina.base=${CATALINA_BASE} \
-Dcatalina.home=${CATALINA_HOME} \
-Djava.endorsed.dirs=${JAVA_ENDORSED_DIRS} \
-Djava.io.tmpdir=${CATALINA_TMPDIR} \
-Djava.util.logging.config.file=${CATALINA_BASE}/conf/logging.properties \
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager \
org.apache.catalina.startup.Bootstrap \
stop

SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

在 /etc/default/tomcat 中

CATALINA_HOME=/opt/tomcat
CATALINA_BASE=/opt/tomcat
CATALINA_TMPDIR=/opt/tomcat/temp
CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC
JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom
JAVA_ENDORSED_DIRS=/opt/tomcat/endorsed
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64
CLASSPATH=/opt/tomcat/bin/bootstrap.jar:/opt/tomcat/bin/tomcat-juli.jar

答案3

看起来这是由于 Tomcat 的“最近”版本中引入的一个错误造成的。请查看此答案:https://stackoverflow.com/a/54452870/4735682,因为它指向正确的错误报告。

Tomcat 的最新版本没有这个错误,因此更新应该可以解决您的问题,而无需摆弄 systemd 单元文件。

相关内容