我正在尝试创建一个在引导上运行的服务。该服务是我用C++编写并编译的程序,位于我的用户主目录中。该程序打开一些UDP套接字,并处于无限循环中,因此不会自动退出。我可以手动运行程序,一切都按预期运行,但是当我运行systemctl start myservice
时,检查程序的状态,就会发现它没有运行。下面的错误结果+其他有用的信息。操作系统是CentOS流。
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)
日志
中的错误消息
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
发布于 2021-08-17 12:32:07
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
https://unix.stackexchange.com/questions/664811
复制相似问题