解决systemd问题:Unit xx.service could not be found.

原因

SELinux 上下文不正确。

cpmv 命令复制文件,并不会更新 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
2
3
4
5
6
7
8
9
10
11
12
13
14
# ls /opt/xxx/ -l
total 40
drwxr-xr-x. 2 1000 1000 4096 May 7 2022 bin
drwxr-xr-x. 2 1000 1000 92 Jun 28 16:18 conf
drwxr-xr-x. 3 root root 35 Jun 28 21:33 data
drwxr-xr-x. 5 1000 1000 4096 May 7 2022 docs
drwxr-xr-x. 2 root root 4096 Jun 28 16:14 lib
-rw-r--r--. 1 1000 1000 11358 May 7 2022 LICENSE.txt
drwxr-xr-x. 2 root root 76 Jun 28 16:24 logs
-rw-r--r--. 1 1000 1000 2084 May 7 2022 NOTICE.txt
-rw-r--r--. 1 1000 1000 2214 May 7 2022 README.md
-rw-r--r--. 1 1000 1000 3570 May 7 2022 README_packaging.md
-rw-r--r--. 1 root root 333 Jun 28 21:32 xxx.service

最后修正下目录所有者

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

可以了。