Tomcatstartup.sh 파일은 작동하지만 tomcat.service를 시작할 수 없습니다.

Tomcatstartup.sh 파일은 작동하지만 tomcat.service를 시작할 수 없습니다.

단편:

"sudo systemctl start tomcat"을 실행하면 shutdown.sh가 start.sh 직후에 호출되는 것 같습니다.

Feb 03 19:36:49 xxxxx startup.sh[10285]: Tomcat started.
Feb 03 19:36:49 xxxxx shutdown.sh[10294]: NOTE: Picked up JDK_JAVA_OPTIONS:  --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
Feb 03 19:36:54 xxxxx shutdown.sh[10294]: Feb 03, 2019 7:36:53 PM org.apache.catalina.startup.Catalina stopServer

그리고 수동으로 start.sh를 호출하면 문제가 없을 것입니다.

매우 긴 이야기:

다음 스크립트를 사용하여 Tomcat을 다운로드하고 설치했습니다.

#Add Tomcat group
sudo groupadd tomcat 
#Add Tomcat user, creating a home directory.
sudo useradd -m -g tomcat -d /opt/tomcat -s /bin/nologin tomcat
#Move to temp directory
cd /tmp
#Get Tomcat tar file
wget https://www-eu.apache.org/dist/tomcat/tomcat-9/v9.0.14/bin/apache-                
tomcat-9.0.14.tar.gz
#Extract tar file to /opt/tomcat folder
tar -zxvf apache-tomcat-9.0.14.tar.gz -C /opt/tomcat/ --strip-components=1
#Give tomcat group recursive ownership of the installation directory
sudo chgrp -R tomcat /opt/tomcat
cd /opt/tomcat
#Give tomcat user execute access and reursive read access to conf
sudo chmod -R g+r conf
sudo chmod g+x conf
#Make tomcat user ownership of required directories
sudo chown -R tomcat webapps/ work/ temp/ logs/
#Make scripts in bin executable
sudo chmod +x /opt/tomcat/bin/*.sh

이 파일을 /etc/systemd/system/tomcat.service에 추가했습니다.

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

[Service]
Type=forking

Environment=JAVA_HOME=/usr/local/jdk-11.0.1
Environment=CATALINA_PID=/opt/tomcat/temp/tomcat.pid
Environment=CATALINA_HOME=/opt/tomcat
Environment=CATALINA_BASE=/opt/tomcat
Environment='CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC'
Environment='JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom'

ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/bin/kill -15 $MAINPID

User=tomcat
Group=tomcat
UMask=0007
RestartSec=10
Restart=always

[Install]
WantedBy=multi-user.target

그런 다음 다음과 같이 실행하면 :

systemctl daemon-reload
systemctl enable tomcat
systemctl start tomcat

시작되지 않습니다.

"systemctl status tomcat -l"에서 다음 출력을 얻습니다.

tomcat.service - Apache Tomcat Web Application Container
  Loaded: loaded (/etc/systemd/system/tomcat.service; enabled; vendor preset: disabled)
  Active: activating (auto-restart) (Result: exit-code) since Sun 2019-02-03 12:49:15 UTC; 3s ago
Process: 9767 ExecStop=/bin/kill -15 $MAINPID (code=exited, status=1/FAILURE)
Process: 9754 ExecStart=/opt/tomcat/bin/startup.sh (code=exited, status=0/SUCCESS)
Main PID: 9765 (code=exited, status=0/SUCCESS)

Feb 03 12:49:15 xxxxx systemd[1]: Unit tomcat.service entered failed state.
Feb 03 12:49:15 xxxxx systemd[1]: tomcat.service failed.

그리고 'journalctl -u tomcat.service -l'은 다음을 반환합니다.

Feb 03 12:48:12 xxxxx systemd[1]: Starting Apache Tomcat Web Application Container...
Feb 03 12:48:12 xxxxx startup.sh[9661]: Existing PID file found during start.
Feb 03 12:48:13 xxxxx startup.sh[9661]: Removing/clearing stale PID file.
Feb 03 12:48:13 xxxxx systemd[1]: Started Apache Tomcat Web Application Container.
Feb 03 12:48:13 xxxxx systemd[1]: tomcat.service: control process exited, code=exited status=1
Feb 03 12:48:13 xxxxx systemd[1]: Unit tomcat.service entered failed state.
Feb 03 12:48:13 xxxxx systemd[1]: tomcat.service failed.

"/opt/tomcat/bin/setenv.sh" 파일을 추가하면 내용은 다음과 같습니다.

export JAVA_HOME=/usr/local/jdk-11.0.1

그런 다음 실행하면:

sudo /opt/tomcat/bin/startup.sh

그러면 Tomcat이 정상적으로 시작할 수 있습니다. 이는 내 tomcat.service 파일에 문제가 있음을 의미합니까?

운영체제는 Centos 7 입니다.

편집 1:

언급할 가치가 있는 또 다른 사항: tomcat 사용자로 startup.sh 명령을 실행하십시오.

sudo -u tomcat /opt/tomcat/bin/startup.sh

모든 것이 잘 작동하므로 사용자 권한 문제는 아닌 것 같습니다.

편집 2:

PID 오류가 오해의 소지가 있다고 생각합니다. "/etc/systemd/system/tomcat.service"의 ExecStop 줄을 다음과 같이 변경했습니다.

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

이제 "journalctl -u tomcat.service -l"의 출력은 다음과 같습니다.

Feb 03 19:36:48 xxxxx systemd[1]: Started Apache Tomcat Web Application Container.
Feb 03 19:36:48 xxxxx systemd[1]: Starting Apache Tomcat Web Application Container...
Feb 03 19:36:49 xxxxx startup.sh[10285]: Tomcat started.
Feb 03 19:36:49 xxxxx shutdown.sh[10294]: NOTE: Picked up JDK_JAVA_OPTIONS:  --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
Feb 03 19:36:54 xxxxx shutdown.sh[10294]: Feb 03, 2019 7:36:53 PM org.apache.catalina.startup.Catalina stopServer
Feb 03 19:36:54 xxxxx shutdown.sh[10294]: SEVERE: Could not contact [localhost:8005] (base port [8005] and offset [0]). Tomcat may not be running.
Feb 03 19:36:54 xxxxx shutdown.sh[10294]: Feb 03, 2019 7:36:54 PM org.apache.catalina.startup.Catalina stopServer
Feb 03 19:36:54 xxxxx shutdown.sh[10294]: SEVERE: Error stopping Catalina
Feb 03 19:36:54 xxxxx shutdown.sh[10294]: java.net.ConnectException: Connection refused (Connection refused)
Feb 03 19:36:54 xxxxx shutdown.sh[10294]: at java.base/java.net.PlainSocketImpl.socketConnect(Native Method)
Feb 03 19:36:54 xxxxx shutdown.sh[10294]: at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:399)
Feb 03 19:36:54 xxxxx shutdown.sh[10294]: at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:242)
Feb 03 19:36:54 xxxxx shutdown.sh[10294]: at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224)
Feb 03 19:36:54 xxxxx shutdown.sh[10294]: at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:403)
Feb 03 19:36:54 xxxxx shutdown.sh[10294]: at java.base/java.net.Socket.connect(Socket.java:591)
Feb 03 19:36:54 xxxxx shutdown.sh[10294]: at java.base/java.net.Socket.connect(Socket.java:540)
Feb 03 19:36:54 xxxxx shutdown.sh[10294]: at java.base/java.net.Socket.<init>(Socket.java:436)
Feb 03 19:36:54 xxxxx shutdown.sh[10294]: at java.base/java.net.Socket.<init>(Socket.java:213)
Feb 03 19:36:54 xxxxx shutdown.sh[10294]: at org.apache.catalina.startup.Catalina.stopServer(Catalina.java:513)
Feb 03 19:36:54 xxxxx shutdown.sh[10294]: at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
Feb 03 19:36:54 xxxxx shutdown.sh[10294]: at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
Feb 03 19:36:54 xxxxx shutdown.sh[10294]: at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
Feb 03 19:36:54 xxxxx shutdown.sh[10294]: at java.base/java.lang.reflect.Method.invoke(Method.java:566)
Feb 03 19:36:54 xxxxx shutdown.sh[10294]: at org.apache.catalina.startup.Bootstrap.stopServer(Bootstrap.java:403)
Feb 03 19:36:54 xxxxx shutdown.sh[10294]: at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:497)

답변1

이 질문은 마침내 제가 대답하는 데 도움이 되었습니다.

https://stackoverflow.com/questions/34614710/why-is-systemd-stopping-service-immediately-after-it-is-started

/etc/systemd/system/tomcat.service에서 삭제했습니다.

Type=forking

그리고

Restart=always

그리고

Type=oneshot

그리고

RemainAfterExit=yes

효과가 있었습니다. 분명히 서비스를 즉시 종료하지 말라고 지시해야 하고, 내가 읽은 600개의 튜토리얼 중 어느 하나도 이에 대해 언급하지 않았기 때문입니다.

관련 정보