解决systemd问题:Unit xx.service could not be found.
原因
SELinux 上下文不正确。
cp
或 mv
命令复制文件,并不会更新 SELinux 上下文,导致即便手动 chmod 777
也还是权限不够。
解决办法
1 | restorecon -rv /path/to/file |
排查过程
部署一个服务,手写了xx.service文件。链接到 /etc/systemd/system/xx.srevice
systemctl daemon-reload 了。
可是systemctl status xx 提示:
Unit xx.service could not be found.
后面删掉文件重写了一遍,服务找到了,但是无法执行。
提示:
xxx.service: Failed to locate executable /opt/xxx/bin/xxx.sh: Permission denied
xxx.service: Failed at step EXEC spawning /opt/xxx/bin/xxx.sh: Permission denied
以为没有执行权限,就执行以下授权命令。
1 | chmod +x /opt/xxx/bin/xxx.sh |
添加还是不行,最后发现 ls -l 发现,用户和组不对劲,我用的是root用户,结果有些文件的用户和用户组的id都是1000,不知道怎么来的。。。
1 | # ls /opt/xxx/ -l |
最后修正下目录所有者
1 | chown -R root:root /opt/xxx/ |
还是不行。提示
xxx.service: Failed to locate executable /opt/xxx/bin/xxx.sh: Permission denied
xxx.service: Failed at step EXEC spawning /opt/xxx/bin/xxx.sh: Permission denied
最后发现是sellinux问题,修正下
1 | restorecon -rv /opt/xxx/bin |
可以了。