systemctl 啟動後立即停止 Tomcat 服務
我首先在 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