【问题标题】:Tomcat 8 on CentOS 7 does not start as service (but it starts manually ....)CentOS 7 上的 Tomcat 8 不作为服务启动(但它手动启动....)
【发布时间】:2019-05-28 09:41:05
【问题描述】:

我在 CentOS 虚拟机上安装了 Tomcat (apache-tomcat-8.5.37)(使用bento/centos-7)。

Tomcat安装在

/opt/tomcat/apache-tomcat-8.5.37

Java 8 安装在

/usr/java/jre1.8.0_192-amd64

在安装 Tomcat 之前,我已经以这种方式创建了一个 tomcat 用户

sudo useradd tomcat
sudo passwd tomcat
sudo mkdir /opt/tomcat
sudo chown -R tomcat:tomcat /opt/tomcat
su – tomcat

如果我尝试使用手动启动 Tomcat

/opt/tomcat/apache-tomcat-8.5.37/bin/startup.sh

一切正常,我可以从 url 测试 Tomcat 广告它的示例

http://192.168.33.10:8080

(注意:192.168.33.10是我的虚拟机的IP……)

我也可以使用

关闭 Tomcat
/opt/tomcat/apache-tomcat-8.5.37/bin/shutdown.sh

我想像 e 服务一样启动 Tomcat,所以我停止了 Tomcat,然后我编辑了一个文件

/etc/systemd/system/tomcat.service

有这个内容

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

[Service]
Type=forking

Environment=JAVA_HOME=/usr/java/jre1.8.0_192-amd64
Environment=CATALINA_PID=/opt/tomcat/apache-tomcat-8.5.37/temp/tomcat.pid
Environment=CATALINA_HOME=/opt/tomcat/apache-tomcat-8.5.37/
Environment=CATALINA_BASE=/opt/tomcat/apache-tomcat-8.5.37/
Environment='CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC'
Environment='JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom'

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

User=tomcat
Group=tomcat
UMask=0007

[Install]
WantedBy=multi-user.target

然后

sudo systemctl daemon-reload

sudo systemctl start tomcat

Tomcat 现在调用 url 没有响应

http://192.168.33.10:8080

的输出
sudo systemctl status tomcat

是关注

● tomcat.service - Apache Tomcat Web Application Container
   Loaded: loaded (/etc/systemd/system/tomcat.service; disabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Tue 2019-01-01 09:34:46 UTC; 13min ago
  Process: 14438 ExecStop=/bin/kill -15 $MAINPID (code=exited, status=1/FAILURE)
  Process: 14425 ExecStart=/opt/tomcat/apache-tomcat-8.5.37/bin/startup.sh (code=exited, status=0/SUCCESS)
 Main PID: 14436 (code=exited, status=0/SUCCESS)

Jan 01 09:34:46 localhost.localdomain systemd[1]: Starting Apache Tomcat Web Application Container...
Jan 01 09:34:46 localhost.localdomain startup.sh[14425]: Existing PID file found during start.
Jan 01 09:34:46 localhost.localdomain startup.sh[14425]: Removing/clearing stale PID file.
Jan 01 09:34:46 localhost.localdomain systemd[1]: Started Apache Tomcat Web Application Container.
Jan 01 09:34:46 localhost.localdomain systemd[1]: tomcat.service: control process exited, code=exited status=1
Jan 01 09:34:46 localhost.localdomain systemd[1]: Unit tomcat.service entered failed state.
Jan 01 09:34:46 localhost.localdomain systemd[1]: tomcat.service failed.

的输出
journalctl -xe

是关注

Jan 01 09:34:46 localhost.localdomain sudo[14418]:   tomcat : TTY=pts/0 ; PWD=/opt/tomcat/apache-tomcat-8.5.37/temp ; USER=root ; COMMAND=/bin/systemctl start tomcat
Jan 01 09:34:46 localhost.localdomain polkitd[635]: Registered Authentication Agent for unix-process:14419:1135902 (system bus name :1.85 [/usr/bin/pkttyagent --notify-fd 5 --fallb
Jan 01 09:34:46 localhost.localdomain systemd[1]: Starting Apache Tomcat Web Application Container...
-- Subject: Unit tomcat.service has begun start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit tomcat.service has begun starting up.
Jan 01 09:34:46 localhost.localdomain startup.sh[14425]: Existing PID file found during start.
Jan 01 09:34:46 localhost.localdomain startup.sh[14425]: Removing/clearing stale PID file.
Jan 01 09:34:46 localhost.localdomain startup.sh[14425]: Tomcat started.
Jan 01 09:34:46 localhost.localdomain polkitd[635]: Unregistered Authentication Agent for unix-process:14419:1135902 (system bus name :1.85, object path /org/freedesktop/PolicyKit1
Jan 01 09:34:46 localhost.localdomain systemd[1]: Started Apache Tomcat Web Application Container.
-- Subject: Unit tomcat.service has finished start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit tomcat.service has finished starting up.
--
-- The start-up result is done.
Jan 01 09:34:46 localhost.localdomain kill[14438]: Usage:
Jan 01 09:34:46 localhost.localdomain kill[14438]: kill [options] <pid|name> [...]
Jan 01 09:34:46 localhost.localdomain kill[14438]: Options:
Jan 01 09:34:46 localhost.localdomain kill[14438]: -a, --all              do not restrict the name-to-pid conversion to processes
Jan 01 09:34:46 localhost.localdomain kill[14438]: with the same uid as the present process
Jan 01 09:34:46 localhost.localdomain kill[14438]: -s, --signal <sig>     send specified signal
Jan 01 09:34:46 localhost.localdomain kill[14438]: -q, --queue <sig>      use sigqueue(2) rather than kill(2)
Jan 01 09:34:46 localhost.localdomain kill[14438]: -p, --pid              print pids without signaling them
Jan 01 09:34:46 localhost.localdomain kill[14438]: -l, --list [=<signal>] list signal names, or convert one to a name
Jan 01 09:34:46 localhost.localdomain kill[14438]: -L, --table            list signal names and numbers
Jan 01 09:34:46 localhost.localdomain kill[14438]: -h, --help     display this help and exit
Jan 01 09:34:46 localhost.localdomain kill[14438]: -V, --version  output version information and exit
Jan 01 09:34:46 localhost.localdomain kill[14438]: For more details see kill(1).
Jan 01 09:34:46 localhost.localdomain systemd[1]: tomcat.service: control process exited, code=exited status=1
Jan 01 09:34:46 localhost.localdomain systemd[1]: Unit tomcat.service entered failed state.
Jan 01 09:34:46 localhost.localdomain systemd[1]: tomcat.service failed.
Jan 01 09:34:59 localhost.localdomain sudo[14451]:   tomcat : TTY=pts/0 ; PWD=/opt/tomcat/apache-tomcat-8.5.37/temp ; USER=root ; COMMAND=/bin/systemctl status tomcat
Jan 01 09:48:45 localhost.localdomain sudo[15115]:   tomcat : TTY=pts/0 ; PWD=/opt/tomcat/apache-tomcat-8.5.37/bin ; USER=root ; COMMAND=/bin/systemctl status tomcat

catalina.out 的输出如下

01-Jan-2019 09:09:21.585 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["ajp-nio-8009"]
01-Jan-2019 09:09:21.602 INFO [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/read
01-Jan-2019 09:09:21.614 INFO [main] org.apache.catalina.startup.Catalina.load Initialization processed in 2829 ms
01-Jan-2019 09:09:21.697 INFO [main] org.apache.catalina.core.StandardService.startInternal Starting service [Catalina]
01-Jan-2019 09:09:21.697 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet Engine: Apache Tomcat/8.5.37
01-Jan-2019 09:09:21.738 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/opt/tomcat/apache-tomcat-8.5.37/webapps/ROOT]
01-Jan-2019 09:09:22.777 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/opt/tomcat/apache-tomcat-8.5.37/webapps/ROOT] has finished in [1,038] ms
01-Jan-2019 09:09:22.795 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/opt/tomcat/apache-tomcat-8.5.37/webapps/docs]
01-Jan-2019 09:09:22.847 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/opt/tomcat/apache-tomcat-8.5.37/webapps/docs] has finished in [70] ms
01-Jan-2019 09:09:22.847 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/opt/tomcat/apache-tomcat-8.5.37/webapps/examples]
01-Jan-2019 09:09:23.468 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/opt/tomcat/apache-tomcat-8.5.37/webapps/examples] has finished in [621] ms
01-Jan-2019 09:09:23.469 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/opt/tomcat/apache-tomcat-8.5.37/webapps/host-manager]
01-Jan-2019 09:09:23.522 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/opt/tomcat/apache-tomcat-8.5.37/webapps/host-manager] has finished in [54] ms
01-Jan-2019 09:09:23.522 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/opt/tomcat/apache-tomcat-8.5.37/webapps/manager]
01-Jan-2019 09:09:23.569 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/opt/tomcat/apache-tomcat-8.5.37/webapps/manager] has finished in [47] ms
01-Jan-2019 09:09:23.592 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
01-Jan-2019 09:09:23.601 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-nio-8009"]
01-Jan-2019 09:09:23.604 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 1990 ms
01-Jan-2019 09:12:38.830 INFO [main] org.apache.catalina.core.StandardServer.await A valid shutdown command was received via the shutdown port. Stopping the Server instance.
01-Jan-2019 09:12:38.831 INFO [main] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["http-nio-8080"]
01-Jan-2019 09:12:38.870 INFO [main] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["ajp-nio-8009"]
01-Jan-2019 09:12:38.878 INFO [main] org.apache.catalina.core.StandardService.stopInternal Stopping service [Catalina]
01-Jan-2019 09:12:39.117 INFO [main] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["http-nio-8080"]
01-Jan-2019 09:12:39.123 INFO [main] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["ajp-nio-8009"]
01-Jan-2019 09:12:39.131 INFO [main] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["http-nio-8080"]
01-Jan-2019 09:12:39.137 INFO [main] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["ajp-nio-8009"]

??????

欢迎提出建议!!

【问题讨论】:

  • tomcat日志文件的内容是什么?
  • 我在原始问题中加入了 catalina.out 内容....谢谢!
  • 您的各种日志文件中的时间不匹配 -- 我不认为 catalina.out 内容来自您发布日志文件的系统开始。
  • 请看我的回答。它就像魅力一样。接受答案以帮助社区最终获得更好的答案。

标签: java tomcat centos7


【解决方案1】:

注意:截至 2019 年 10 月

  1. 我关注了BUGhttps://bz.apache.org/bugzilla/show_bug.cgi?id=63063,还是没有解决问题。
  2. 我几乎没有反复试验,问题得到了解决。根据标准,它运行顺畅并且完全正常。即使您像下面提到的那样优雅地终止 tomcat 服务或使用kill -9 然后使用systemctl 启动 tomcat 服务,它也可以像魅力一样工作。

我正在使用 Ubuntu 16.04、tomcat 8.5.37、Java 1.8.0_222

我使用了下面的 systemd 脚本,保存在位置:/etc/systemd/system/

# Systemd unit file for tomcat
[Unit]
Description=Apache Tomcat Web Application Container for ShopWorx
After=syslog.target network.target

[Service]
Type=forking
WorkingDirectory=/usr/local/tomcat/bin

ExecStart=/bin/bash /usr/local/tomcat/bin/catalina.sh start
ExecStop=/bin/bash /usr/local/tomcat/bin/catalina.sh stop

User=emgda
Group=emgda

[Install]
WantedBy=multi-user.target

并按顺序运行以下命令

systemctl daemon-reload

systemctl start tomcat

systemctl status tomcat

下面是tomcat服务状态的输出。

● tomcat.service - Apache Tomcat Web Application Container for ShopWorx
   Loaded: loaded (/etc/systemd/system/tomcat.service; disabled; vendor preset: enabled)
   Active: active (running) since Wed 2019-10-09 14:52:08 IST; 1min 46s ago
  Process: 3713 ExecStart=/bin/bash /usr/local/tomcat/bin/catalina.sh start (code=exited, status=0/SUCCESS)
 Main PID: 3720 (bash)
   CGroup: /system.slice/tomcat.service
           ├─3720 /bin/bash /usr/local/tomcat/bin/catalina.sh start
           └─3722 /usr/lib/jvm/java-8-openjdk-amd64/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.

Oct 09 14:52:08 ubuntu systemd[1]: Starting Apache Tomcat Web Application Container ...
Oct 09 14:52:08 ubuntu bash[3713]: Tomcat started.
Oct 09 14:52:08 ubuntu systemd[1]: Started Apache Tomcat Web Application Container.

重要提示WorkingDirectoryExecStartExecStop 必须小心,他们的价值观至关重要。

【讨论】:

  • 谢谢。我相信 WorkingDirectory 是我唯一缺少的部分。我正在使用 RedHat 7.6,终于有了一个可以工作的 Tomcat 9 systemd 服务!
【解决方案2】:

我找到了相关的错误报告:

Bug 63063

Bug 63041

此错误将在下一个版本中修复。

【讨论】:

  • 虽然这本身不是一个“解决方案”,但这是对许多与此相关的 SO 问题的解释。感谢您提供的线索,因为我已经浪费了很多时间来尝试调试这个问题。
  • 这个问题并没有像它说的那样得到解决。应用此解决方案后,Tomcat 服务看起来确实已启动,但在内部它已被阻止。该问题在 9.x 中仍然存在。
【解决方案3】:

一个常见问题,当您手动启动一次tomcat(使用您自己的用户帐户)时,临时文件、日志等属于您,而不是守护程序用户(tomcat,根据引用的tomcat.service文件。由于缺少权限,后续启动时守护程序用户无法覆盖这些文件 - 这也可能会阻止正确记录这些问题。

修复这些权限(或者更确切地说:文件所有权),然后重试。我的守护进程启动脚本通常有一个chown 用于相关文件,只是为了确保我不会遇到这些问题,以防有人手动开始使用错误的用户帐户。

【讨论】:

  • 我在最初的问题中添加了一些关于 tomcat 用户的详细信息,我创建了用于安装 Tomcat 的广告。检查我的 CentOS 7 VM 上的所有 Tomcat 目录(so、bin、longs、temp、ecc ..)都归 tomcat 用户和组所有。这是正确的还是我必须在某个地方和哪里改变一些东西?谢谢!
  • 二进制文件和目录不需要属于用户tomcat - 事实上,如果您的某个应用程序有任何远程文件访问漏洞,最好该用户不能覆盖那些二进制文件——但对于临时文件、工作文件和日志文件来说,这是必不可少的。
  • 好的...我已按照这些说明进行操作..linuxize.com/post/how-to-install-tomcat-8-5-on-centos-7 ...
【解决方案4】:

按照错误消息中的说明删除 pid 文件

在启动过程中发现现有的 PID 文件。

/opt/tomcat/apache-tomcat-8.5.37/temp/tomcat.pid

【讨论】:

    【解决方案5】:

    我已经解决了改变这一行的问题

    ExecStop=/bin/kill -15 $MAINPID
    

    ExecStop=sudo /bin/kill -15 $MAINPID
    

    在我的/etc/systemd/system/tomcat.service 文件中。

    它的新内容现在是

    [Unit]
    Description=Apache Tomcat Web Application Container
    After=syslog.target network.target
    
    [Service]
    Type=forking
    
    Environment=JAVA_HOME=/usr/java/jre1.8.0_192-amd64
    Environment=CATALINA_PID=/opt/tomcat/apache-tomcat-8.5.37/temp/tomcat.pid
    Environment=CATALINA_HOME=/opt/tomcat/apache-tomcat-8.5.37/
    Environment=CATALINA_BASE=/opt/tomcat/apache-tomcat-8.5.37/
    Environment='CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC'
    Environment='JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom'
    
    ExecStart=/opt/tomcat/apache-tomcat-8.5.37/bin/startup.sh
    ExecStop=sudo /bin/kill -15 $MAINPID
    
    User=tomcat
    Group=tomcat
    UMask=0007
    
    [Install]
    WantedBy=multi-user.target
    

    现在tomcat服务以

    开始
    sudo systemctl start tomcat
    

    和输出

    sudo systemctl status tomcat
    

    [vagrant@localhost system]$ sudo systemctl status tomcat
    ● tomcat.service - Apache Tomcat Web Application Container
       Loaded: loaded (/etc/systemd/system/tomcat.service; enabled; vendor preset: disabled)
       Active: activating (auto-restart) since Tue 2019-01-08 20:28:25 UTC; 1s ago
      Process: 14447 ExecStart=/opt/tomcat/apache-tomcat-8.5.37/bin/startup.sh (code=exited, status=0/SUCCESS)
     Main PID: 14458 (code=exited, status=0/SUCCESS)
    

    【讨论】:

      【解决方案6】:

      有时您的 java 堆内存会超过您当前的服务器内存。您可以在 tomcat8 的 setenv.sh 文件中设置它,然后重新启动服务器。

      当我在 tomcat 无法重新启动后降级系统配置时遇到了同样的问题,所以我只调整了 tomcat/bin/setenv.sh 文件和 /etc/systemd/system/ 中的堆内存tomcat.service 文件根据系统配置然后我重启了tomcat。现在它工作正常。

      【讨论】:

        【解决方案7】:

        在旧的 CentOS 6.10 中,解决方案正在更改 /etc/init.d/tomcat8

        使用 runuser 代替 su 或 sudo 如此改变

        /bin/su $TOMCAT_USER -c $CATALINA_HOME/bin/startup.sh
        

        /sbin/runuser -s /bin/sh $TOMCAT_USER $CATALINA_HOME/bin/startup.sh
        

        【讨论】:

          【解决方案8】:

          也许你可以试试这个:

          [Unit]
          Description=Tomcat
          After=network.target
          
          [Service]
          Type=forking
          
          Environment=JAVA_HOME=/usr/local/jdk1.8.0_251
          Environment=LD_LIBRARY_PATH=/usr/local/apr/lib
          Environment=LD_RUN_PATH=/usr/local/apr/lib
          PIDFile=/usr/local/apache-tomcat-9.0.36/bin/tomcat_8080.pid
          ExecStart=/usr/local/apache-tomcat-9.0.36/bin/startup.sh
          ExecReload=/usr/local/apache-tomcat-9.0.36/bin/catalina.sh restart
          ExecStop=/usr/local/apache-tomcat-9.0.36/bin/shutdown.sh
          PrivateTmp=true
          
          User=root
          Group=root
          
          [Install]
          WantedBy=multi-user.target
          

          指定apr/lib很重要

          【讨论】:

            猜你喜欢
            • 2020-07-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-06-30
            • 2016-05-31
            • 2018-04-26
            • 2013-06-19
            相关资源
            最近更新 更多