笔者报错时的运行环境:
- Red Hat Enterprise Linux 9
问题描述
最近笔者在 RHEL 上设置包括 Nacos、Redis 等等多个软件的开机自启动时,都在开机启动时失败,而且报错信息核心内容都相同,都是启动时执行启动脚本发生一种“权限被拒绝”的错误。
具体来说,笔者先在目录 /etc/systemd/system
下编写了一个关于 Nacos 开机启动的 .service
文件,并在该文件中的属性 ExecStart
中给出了 Nacos 的启动命令,然后设置了 Nacos 服务的自启动。但 Red Hat Enterprise Linux 9 重启后,笔者发现 Nacos 并没有启动,Nacos 端口号并没有生成。查看 Nacos 服务状态信息,发现“权限被拒绝”的错误。
具体报错内容如下:
[root@192 ~]# systemctl start nacos.service
Job for nacos.service failed because the control process exited with error code.
See "systemctl status nacos.service" and "journalctl -xeu nacos.service" for details.
[root@192 ~]# systemctl status nacos.service
× nacos.service - nacos-server
Loaded: loaded (/etc/systemd/system/nacos.service; enabled; preset: disabled)
Active: failed (Result: exit-code) since Sat 202X-XX-XX XX:XX:XX CST; Xmin XXs ago
Process: 979 ExecStart=/usr/local/nacos/bin/startupbyos.sh -m standalone (code=exited, status=203/EXEC)
CPU: 4ms
XX月 XX XX:XX:XX localhost systemd[1]: Starting nacos-server...
XX月 XX XX:XX:XX localhost systemd[979]: nacos.service: Failed to locate executable /usr/local/nacos/bin/startupbyos.sh: Permission denied
XX月 XX XX:XX:XX localhost systemd[979]: nacos.service: Failed at step EXEC spawning /usr/local/nacos/bin/startupbyos.sh: Permission denied
XX月 XX XX:XX:XX localhost systemd[1]: nacos.service: Control process exited, code=exited, status=203/EXEC
XX月 XX XX:XX:XX localhost systemd[1]: nacos.service: Failed with result 'exit-code'.
XX月 XX XX:XX:XX localhost systemd[1]: Failed to start nacos-server.
[root@192 ~]# journalctl -xeu nacos.service
░░ Support: https://access.redhat.com/support
░░
░░ nacos.service 单元已开始启动。
X月 XX XX:XX:XX 192.168.XXX.XXX systemd[2453]: nacos.service: Failed to locate executable /usr/local/nacos/bin/startupbyos.sh: Permission denied
░░ Subject: 进程 /usr/local/nacos/bin/startupbyos.sh 无法执行
░░ Defined-By: systemd
░░ Support: https://access.redhat.com/support
░░
░░ 进程 /usr/local/nacos/bin/startupbyos.sh 无法被执行并已失败。
░░
░░ 该进程返回的错误代码为 ERRNO。
X月 XX XX:XX:XX 192.168.XXX.XXX systemd[2453]: nacos.service: Failed at step EXEC spawning /usr/local/nacos/bin/startupbyos.sh: Permission denied
░░ Subject: 进程 /usr/local/nacos/bin/startupbyos.sh 无法执行
░░ Defined-By: systemd
░░ Support: https://access.redhat.com/support
░░
░░ 进程 /usr/local/nacos/bin/startupbyos.sh 无法被执行并已失败。
░░
░░ 该进程返回的错误代码为 ERRNO。
X月 XX XX:XX:XX 192.168.XXX.XXX systemd[1]: nacos.service: Control process exited, code=exited, status=203/EXEC
░░ Subject: Unit process exited
░░ Defined-By: systemd
░░ Support: https://access.redhat.com/support
░░
░░ An ExecStart= process belonging to unit nacos.service has exited.
░░
░░ The process' exit code is 'exited' and its exit status is 203.
X月 XX XX:XX:XX 192.168.XXX.XXX systemd[1]: nacos.service: Failed with result 'exit-code'.
░░ Subject: Unit failed
░░ Defined-By: systemd
░░ Support: https://access.redhat.com/support
░░
░░ The unit nacos.service has entered the 'failed' state with result 'exit-code'.
X月 XX XX:XX:XX 192.168.XXX.XXX systemd[1]: Failed to start nacos-server.
░░ Subject: nacos.service 单元已失败
░░ Defined-By: systemd
░░ Support: https://access.redhat.com/support
░░
░░ nacos.service 单元已失败。
░░
░░ 结果为“failed”。
问题原因
笔者单独运行了 .service
文件的属性 ExecStart
中的 Nacos 的启动命令,发现这个命令的运行是没有问题的。说明笔者在 .service
文件中的配置没有问题。笔者又在不同的 Linux 操作系统中实验,终于发现了原因所在。
Red Hat 内置了 SELinux(Security-Enhanced Linux)来保障 Linux 的安全,目录 /etc/systemd/system
中的服务也会受到安全策略的影响。如果该服务涉及 SELinux 不允许的操作。这有会让目录 /etc/systemd/system
中的服务因权限不足无法启动。
解决办法
知道原因就好办了。SELinux 的配置文件为 /etc/selinux/config
。修改文件 /etc/selinux/config
,将其中的属性 SELINUX
由 enforcing
改为 disabled
。这样会关闭 SELinux。然后重启 Linux 即可。这样之后,Nacos 的服务就正常启动了。