Tomcat 从命令行运行,但不会作为 systemd 服务启动

Tomcat 从命令行运行,但不会作为 systemd 服务启动

我已经在 Oracle Linux 9 上构建了一个 Apache Tomcat 9.0.83 服务器,它不会作为systemd服务启动,但如果您从命令行运行它,它确实可以工作。

sudo su - tomcat /u01/tomcat/my_server/bin/startup.sh

错误消息表明禁止启动startup.shTomcatbin目录中的 shell 脚本。我做错了什么?

这是我所知道的。

journalctl -xeu my_server_tomcat.service

这表明它因以下错误而死亡。

systemd[4508]:我的服务器tomcat.服务:无法找到可执行文件 /u01/tomcat/my_server/bin/startup.sh:权限被拒绝

  • 主题:无法执行进程 /u01/tomcat/my_server/bin/startup.sh
  • 进程 /u01/tomcat/my_server/bin/startup.sh 无法执行,失败。

12月05日 10:35:49 myserver.sunyjcc.edu systemd[4508]: my_server_tomcat.service:步骤 EXEC 生成 /u01/tomcat/my_server/bin/startup.sh 失败:权限被拒绝

  • 主题:无法执行进程 /u01/tomcat/my_server/bin/startup.sh
  • 进程 /u01/tomcat/my_server/bin/startup.sh 无法执行,失败。

startup.sh 文件存在且可执行

$ ls -lrtZ /u01/tomcat/my_server/bin/startup.sh
-rwxrwxr-x. 1 tomcat tomcat system_u:object_r:default_t:s0 1904 Nov  9 21:57 /u01/tomcat/my_server/bin/startup.sh

我在 Oracle Linux 7 服务器上有一个 Tomcat 服务,具有相同的 selinux 安全上下文,我可以毫无困难地启动它

/etc/systemd/system/my_server_tomcat.service

[Unit]
Description=PROD my_server (Tomcat 9.0.83)
After=syslog.target network.target

[Service]
User=tomcat
Group=tomcat
Type=forking
Environment=JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk
Environment=CATALINA_PID=/u01/tomcat/my_server/tomcat.pid
Environment=CATALINA_HOME=/u01/tomcat/my_server
Environment=CATALINA_BASE=/u01/tomcat/my_server
ExecStart=/u01/tomcat/my_server/bin/startup.sh
ExecStop=/u01/tomcat/my_server/bin/shutdown.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target

类似问题


编辑

我使用 关闭了 SELinux,sudo setenforce 0然后服务启动了,所以我知道 SELinux 是问题的原因。经过一番折腾之后,我从审计日志中得到了以下消息,并使用 对其进行了解释audit2allow

sudo cat /var/log/audit/audit.log | grep 1702649015.089:80 | audit2allow -lw 

type=AVC msg=audit(1702649015.089:80): avc:  denied  { execute } for  pid=1336 comm="(artup.sh)" name="startup.sh" dev="dm-0" ino=67467631 scontext=system_u:system_r:init_t:s0 tcontext=system_u:object_r:root_t:s0 tclass=file permissive=0

    Was caused by:
        Missing type enforcement (TE) allow rule.

        You can use audit2allow to generate a loadable module to allow this access.

这是 建议的模块audit2allow

sudo cat /var/log/audit/audit.log | grep 1702649015.089:80 | audit2allow -m my_server | tee junk.dat

module my_server 1.0;

require {
        type root_t;
        type init_t;
        class file execute;
}

#============= init_t ==============
allow init_t root_t:file execute;

我不明白为什么它建议为此创建一个模块。在我看来应该有一个更简单的解决方案。

答案1

我决定使用audit2allow创建一个允许访问的模块。下面是我让它工作的方法。

首先,将 SELinux 设置为宽容模式。

sudo setenforce 0
sudo systemctl start my_server_tomcat.service

然后重新启动服务器并让 Tomcat 服务器运行一小会儿。从 Tomcat 服务器拉取几个页面以确保它已经运行了一点。完成后,使用它audit2allow来创建一个新模块。

sudo audit2allow -al -M my_tomcat # Create a new module definition

-l选项表示仅查看自上次启动以来发生的事情。由于系统尚未准备好投入生产,因此不应有任何不必要的权限。您仍应查看my_tomcat.te以确保其中没有不该有的东西。如果没问题,则将其作为模块安装并重新打开 SELinux。

sudo semodule -i my_tomcat.pp # Load the new module.
sudo setenforce 1              # Set SELinux back to enforcing mode.

重启服务器,它仍然在运行。你可能不得不回去修改并重新编译策略,但至少我们知道我们可以让它运行。

相关内容