【发布时间】:2025-05-02 21:10:01
【问题描述】:
一直在研究这个问题。我查看了有关此问题的多篇文章。这是最接近的:
Tomcat 8 on CentOS 7 does not start as service (but it starts manually ....)
不同之处在于我运行的是 Tomcat 9.0.33。详情如下:
java version "1.8.0_121"\
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)\
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)\
Tomcat 9.0.33
NAME="CentOS Linux"\
VERSION="7 (Core)"\
ID="centos"\
ID_LIKE="rhel fedora"\
VERSION_ID="7"\
PRETTY_NAME="CentOS Linux 7 (Core)"\
ANSI_COLOR="0;31"\
CPE_NAME="cpe:/o:centos:centos:7"\
HOME_URL="https://www.centos.org/"\
BUG_REPORT_URL="https://bugs.centos.org/"\
CENTOS_MANTISBT_PROJECT="CentOS-7"\
CENTOS_MANTISBT_PROJECT_VERSION="7"\
REDHAT_SUPPORT_PRODUCT="centos"\
REDHAT_SUPPORT_PRODUCT_VERSION="7"\
附带说明,直到最近,一切都正常开始,没有任何问题。据我所知,环境没有任何重大变化。但是,当我最近运行“systemctl restart”命令时,启动开始失败。有 5 个 Tomcat 9.0.33 实例在不同的端口和路径上运行,并且没有改变。我还没有重新启动两个实例(怕它们不会启动),另外三个完全不会启动。详情如下:
Systemd unit file for tomcat\
[Unit]\
Description=Apache Tomcat Web Application Container in Liferay 7.32 TEST for UAT\
After=syslog.target network.target
[Service]\
Type=forking
Environment=JAVA_HOME=/opt/jdk1.8.0_121/jre\
Environment=CATALINA_PID=/opt/liferay/uatapi/liferay-ce-portal-7.3.2-ga3/tomcat-9.0.33/temp/tomcat.pid\
Environment=CATALINA_HOME=/opt/liferay/uatapi/liferay-ce-portal-7.3.2-ga3/tomcat-9.0.33\
Environment=CATALINA_BASE=/opt/liferay/uatapi/liferay-ce-portal-7.3.2-ga3/tomcat-9.0.33\
Environment='CATALINA_OPTS=-Xms1024m -Xmx2048m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:SurvivorRatio=20 -XX:ParallelGCThreads=8 -server -Xdebug -Xrunjdwp:transport=dt_socket,address=5000,server=y,suspend=n'\
Environment='JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom -Duser.timezone=GMT -Dfile.encoding=UTF-8'
ExecStart=/opt/liferay/uatapi/liferay-ce-portal-7.3.2-ga3/tomcat-9.0.33/bin/startup.sh\
ExecStop=/bin/kill -15 $MAINPID
User=tomcat\
Group=tomcat\
UMask=0007
[Install]\
WantedBy=multi-user.target\
运行 systemctl start liferayuat 时的结果
● liferayuat.service - Apache Tomcat Web Application Container in Liferay 7.32 TEST for UAT\
Loaded: loaded (/etc/systemd/system/liferayuat.service; enabled; vendor preset: disabled)\
Active: failed (Result: exit-code) since Sat 2020-12-05 08:44:08 CST; 3s ago\
Process: 10891 ExecStop=/bin/kill -15 $MAINPID (code=exited, status=1/FAILURE)\
Process: 10851 ExecStart=/opt/liferay/uatapi/liferay-ce-portal-7.3.2-ga3/tomcat-9.0.33/bin/startup.sh \(code=exited, status=0/SUCCESS)\
Main PID: 10861 (code=exited, status=0/SUCCESS)
Dec 05 08:44:08 systemd[1]: Starting Apache Tomcat Web Application Container in Liferay 7.32 TEST for UAT...\
Dec 05 08:44:08 startup.sh[10851]: Existing PID file found during start.\
Dec 05 08:44:08 startup.sh[10851]: Removing/clearing stale PID file.\
Dec 05 08:44:08 startup.sh[10851]: Tomcat started.\
Dec 05 08:44:08 systemd[1]: Started Apache Tomcat Web Application Container in Liferay 7.32 TEST for UAT.\
Dec 05 08:44:08 systemd[1]: liferayuat.service: control process exited, code=exited status=1\
Dec 05 08:44:08 systemd[1]: Unit liferayuat.service entered failed state.\
Dec 05 08:44:08 systemd[1]: liferayuat.service failed.
然后是 catalina.out 中唯一的东西:
Listening for transport dt_socket at address: 5000\
java.lang.ClassNotFoundException: org.apache.catalina.startup.Catalina\
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)\
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)\
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)\
at org.apache.catalina.startup.Bootstrap.init(Bootstrap.java:261)\
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:443)\
所以,当我使用 systemctl start 启动实例时,它会失败。但是如果我运行这个命令(以 root 身份...)那么它将启动:
/opt/liferay/uatapi/liferay-ce-portal-7.3.2-ga3/tomcat-9.0.33/bin/startup.sh
如果我运行完整的命令 AS tomcat,它不会以相同的错误开始。因此,问题似乎是权限。 tomcat 用户和组是所有文件和文件夹的所有者。但是,不知何故,tomcat 用户要么没有权限,要么路径被抬高,因此无法找到类文件。我遵循了我上面引用的文章中的建议,但所做的更改没有影响。
我偶然发现了一篇关于 SELINX 的文章,该文章似乎指出了那里的一个问题。这是 SELINUX 设置:
SELinux 状态:启用
SELinuxfs 挂载:/sys/fs/selinux
SELinux 根目录:/etc/selinux
加载的策略名称:targeted
当前模式:许可
配置文件中的模式:permissive
策略 MLS 状态:启用
策略拒绝未知状态:允许
最大内核策略版本:31\
保持实例运行的解决方法只是手动启动它们,但是是什么导致 systemctl start 不起作用?我怀疑权限,但我肯定不明白为什么,因为一切都归 tomcat:tomcat 所有
【问题讨论】:
-
为了可能消除 SELinux 的原因,您可以暂时禁用 SELinux 并查看通过 systemctl 启动是否有效?
-
谢谢吉姆...我也看到了这个建议。 sudo setenforce 0 不会改变状态。这些实例的 Centos VM 也运行在生产实例的主机上,所以如果需要的话,我无法退回服务器
-
那么您需要在可以进行真正故障排除的地方重现问题。
-
再次感谢。不同的 VM 可能有不同的设置。我当然可以建立一个 CentOS 7 虚拟机,看看我是否可以通过启用和禁用 SELINUX 来模拟这个问题。这不能解释为什么它突然改变,但可能指向一个可能的原因。所以你认为 SELINUX 是这里的根本问题?
-
我不知道。如果您想排除在生产系统上无法解决的问题,则必须在测试系统上运行它并更改 SELinux 之类的东西,直到您弄清楚是什么影响了它。