我有 python 代码作为二进制文件。
该二进制文件放置在 /bin/test_service 中
我还有一项服务,例如 test_service:
[Unit]
Description=TestService
After=network.target
[Service]
Type=forking
ExecStartPost=/bin/sh -c 'umask 022; pgrep test_service > /run/test_service.pid'
PIDFile=/run/test_service.pid
OOMScoreAdjust=-100
ExecStart=/bin/test_service --start
KillMode=control-group
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
为了运行这个服务,我这样做:
systemctl daemon-reload
systemctl enable test_service
systemctl start test_service
但出现错误:(sudojournalctl-xe)
centos test_service[4234]: [4235] Failed to execute script
centos test_service[4234]: Traceback (most recent call last):
centos test_service[4234]: File "test_service/run.py", line 21, in main
centos test_service[4234]: File "test_service/run.py", line 61, in create_app_directory
centos test_service[4234]: File "os.py", line 220, in makedirs
centos test_service[4234]: PermissionError: [Errno 13] Permission denied: '/opt/test_service/'
在我的 python 代码的开头有一行用于检查哪个用户运行脚本。之后我尝试创建一些文件和文件夹,其中之一是 /opt/test_service/:
if os.geteuid() != 0:
raise Exception("failed: should be root")
os.makedir("/opt/test_service/")
结果我得到了错误:
Permission denied: '/opt/test_service/'
相反,当我运行下一个命令时,一切都很好:
/bin/sudo /bin/test_service --start
同样的服务在 Ubuntu/Debian/SUSE 下运行良好...
你能帮我解决这个问题吗?
据我了解,服务以 root 权限运行,二进制文件也应该以 root 权限执行,但出了问题......
最近我在 CentOS 7 下测试了这项服务,一切都很好,但在 CentOS 8.1 上我遇到了问题。
答案1
到最后已经找到了答案。我不确定这是否是最好的决定,但我的问题已经消失了。
我已经编辑了该文件:
/etc/selinux/config
从:
SELINUX=enforcing
到:
SELINUX=disabled
重新启动服务器(CentOS 8.1)
正如@annahri 所提到的,这种方式是不合适的。
为了以正确的权限运行我的服务,我更改了一些文件和文件夹的上下文以满足 SELinux 的要求:
chcon -R system_u:object_r:bin_t:s0 /bin/test_service
chcon -R system_u:object_r:bin_t:s0 /opt/test_service