Linux

systemctl 啟動後立即停止 Tomcat 服務

  • February 8, 2019

我首先在 StackOverflow 上問了這個問題,但似乎這個網站更合適。

我正在設置一個 Web 應用程序環境來執行 Java 應用程序。環境應該是:

  • AWS EC2 Ubuntu 18
  • 爪哇 8
  • 雄貓 9

我啟動了一個 EC2 實例並安裝了 java,然後我按照本指南設置了 Tomcat: https ://www.digitalocean.com/community/tutorials/install-tomcat-9-ubuntu-1804

現在,當systemctl嘗試啟動/重新啟動 Tomcat 服務時,問題就出現了。這是我在查看 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: Connection denied (Connection denied)
12 月 19 日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: at java.net.PlainSocketImpl.socketConnect(Native Method)
12 月 19 日 13:35:26 ip-10-165-10-74 shutdown.sh[1725]: at 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]: at 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]: at 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(本機方法)
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 停止。

系統配置:

[單元]
描述=Apache Tomcat Web 應用程序容器
之後=network.target

[服務]
**類型=分叉**

環境=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'
Environment='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=多使用者.target

據我了解,這裡的問題是 Tomcat 無法連接到 8005 埠以監聽關機命令。

但是,我在 EC2 安全組控制台中打開了這個埠: 8005 127.0.0.1/32

另一個奇怪的事情是,Tomcat 在重啟 ec2 實例時啟動正常,但無法重啟並拋出上述異常。

這裡可能有什麼問題?如何檢查埠 8005 是否實際打開?

===========

好吧,我取得了一些進展,我發現 Tomcat 似乎工作正常。startup.sh工作正常 - 您可能會在日誌中看到這一點 - 它與“Tomcat 已啟動”相呼應。這是 中的最後一行catalina.sh start。但是,我不明白為什麼systemctl在服務啟動後立即嘗試停止服務。它發送catalina.sh stop命令。

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

它解釋了我閱讀的教程(以及大量其他複製粘貼的教程)中建議的典型安裝可能出現的問題。我無法弄清楚為什麼會出現問題。可能是 catalina.sh、startup.sh 等引入的所有層的問題。

所以基本上,我重寫了 systemd 配置腳本,它開始工作了。

我有同樣的問題。只有我在使用 Amazon Lightsail。也許亞馬遜配置他們的 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

引用自:https://serverfault.com/questions/946034