我想使用以下 cmdlet 在 CentOS 上启动 Tomcat 服务:
systemctl start tomcat.service
但我得到了错误
无法启动 Apache ExecStart=/opt/tomcat/bin/startup.sh(代码=exited,状态=203/EXEC)。
并通过命令记录:
Journalctl -xe
说明
Selinux 阻止 (artup.sh) 对文件 startup.sh 进行执行访问
鉴于我可以在我的 CentOS 上启动任何其他服务,那么我的 tomcat 服务可能存在什么问题?
谢谢
答案1
SELinux 将 ExecStart 中可使用的二进制文件限制为设置了 system_u:object_r:bin_t:s0 属性的路径。通常这些路径是 /usr/bin /usr/sbin /usr/libexec /usr/local/bin 目录。
您需要将脚本移动到以下目录之一或更改 selinux 策略以允许 systemd 使用所需位置中的二进制文件:
chcon -R -t bin_t /opt/tomcat/bin/
restorecon 将“取消修复”上述内容,以便更好地更新策略,例如
semanage fcontext -a -t bin_t "/opt/tomcat/bin(/.*)?"
restorecon -r -v /opt/tomcat/bin
更新
如果 java 二进制文件不在标准位置(自定义 JVM 分布),则需要设置bin_t标签也添加到其中。例如,如果您的 JVM 安装在 /opt/java 中,则:
semanage fcontext -a -t bin_t "/opt/java/bin(/.*)?"
restorecon -r -v /opt/java/bin
注意:如果单元文件中未设置 JAVA_HOME 环境变量,systemd 将忽略该变量。