我正在尝试创建一个在启动时运行的服务。该服务是我用 C++ 编写并编译的程序,位于我的用户主目录中。该程序打开一些 UDP 套接字并处于无限循环中,因此不会自动退出。我可以手动运行该程序,一切都按预期工作,但是当我运行systemctl start myservice
然后检查状态时,我发现它没有运行。下面的错误结果+其他有用的信息。仅供参考,操作系统是 CentOS Stream。
输出来自systemctl status myservice
myservice.service - my serivce
Loaded: loaded (/etc/systemd/system/myservice.service; disabled; vendor present: disabled)
Active: failed (Result: exit-code) since <redacted unnecessary timestamp>
Process 2101 ExecStart=/home/user/program (code=exited, status=203/EXEC)
Main PID: 2101 (code=exited, status=203/EXEC)
来自journalctl的错误消息
myservice.service: Main process exited, code=exited, status=203/EXEC
myservice.service: Failed with result 'exit-code'
myservice.service: Service RestartSec=2s expired, scheduling restart
系统单元文件
[Unit]
Description=my service
After=network.target
[Service]
Type=simple
ExecStart=/home/user/program
User=user
WorkingDirectory=/home/user/
Restart=always
RestartSec=2
KillMode=process
[Install]
WantedBy=multi-user.target
我知道 203 状态通常意味着该文件不存在或没有适当的权限,因此下面的输出证明这不是这些问题(希望如此)
输出来自ls -laZ /home/user/program
-rwxrwxrwx. 1 root root unconfined_u:object_r:user_home_t:s0 803168 Aug 14 23:35 /home/user/program
输出来自sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Memory protection checking: actual (secure)
Max kernel policy version: 33
输出来自ausearch -ts recent -m avc -i
type=PROCTITLE msg=audit(08/16/2021 20:14:04.216:698) : proctitle=(ster_myservice)
type=SYSCALL msg=audit(08/16/2021 20:14:04.216:698) : arch=x86_64 syscall=execve success=no exit=EACCES(Permission denied) a0=0x5572ff82e7a0 a1=0x5572ff6ff6d0 a2=0x5572ff7f54b0 a3=0x1 items=0 ppid=1 pid=2568 auid=unset uid=user gid=user euid=user suid=user fsuid=user egid=user sgid=user fsgid=user tty=(none) ses=unset comm=(ster_myservice) exe=/usr/lib/systemd/systemd subj=system_u:system_r:init_t:s0 key=(null)
type=AVC msg=audit(08/16/2021 20:14:04.216:698) : avc: denied { execute } for pid=2568 comm=(ster_myservice) name=program dev="dm-2" ino=137 scontext=system_u:system_r:init_t:s0 tcontext=unconfined_u:object_r:user_home_t:s0 tclass=file permissive=0
答案1
SELinux 正在阻止您的程序运行:AVC 拒绝状态type=AVC msg=audit(08/16/2021 20:14:04.216:698) : avc: denied { execute } for pid=2568 comm=(ster_myservice) name=program dev="dm-2" ino=137 scontext=system_u:system_r:init_t:s0 tcontext=unconfined_u:object_r:user_home_t:s0 tclass=file permissive=0
。
这意味着在init_t
进程上下文下运行的 systemd 不允许启动标记为 的程序user_home_t
。
为了缓解这种情况,请将程序移至标准二进制目录,例如/usr/local/bin
,然后记住使用restorecon -Rv /usr/local/bin
.
或者,如果您需要您的程序要在主目录之外运行,请编译自定义 SELinux 策略模块:
ausearch -m avc -ts recent --comm ster_myservice | audit2allow -a -M ster-myservice
semodule -i ster-myservice.pp
答案2
就我而言,最近的服务器升级更改了 /usr/sbin 目录的权限,从而阻止了 mysql 用户访问它。
尝试:
sudo chmod 755 /usr/sbin