我有一个以 root 身份运行的服务:
[Unit]
Description=my service
After=docker.service network-online.target
Requires=docker.service network-online.target
[Service]
TimeoutStartSec=0
RestartSec=60
Restart=always
User=root
Group=root
ExecStart=/usr/bin/myservice
[Install]
WantedBy=multi-user.target
我遇到了一些意想不到的行为:
当我查看导致失败的环境变量时,环境变量$HOME
被设置为。/root
myservice
但是,作为 root 用户,我得到:
$ echo $HOME
/home/root
这与我所看到的一致/etc/passwd
root:x:0:0:root:/home/root:/bin/sh
当我myservice
手动运行时,它会获取正确的$HOME
环境变量并且可以工作。
我愿意$HOME
成为/home/root
,但不是/root
。所以...
- 从哪里
systemd
获取/root
,为什么会$HOME
被覆盖? systemd
除了$HOME
在服务文件中显式设置环境变量之外,如何防止在全局范围内执行此操作? <-- 在查看源代码后,这似乎不会产生影响
答案1
检查源代码后,我发现systemd
实际上home
为root
用户硬编码了目录。我还没有找到任何可以更改此设置的配置文档,因此对于使用默认主目录的 Yocto 项目来说,需要注意这一点。
我通过将硬编码/root
值修改为/home/root
in来确认这一点https://github.com/systemd/systemd/blob/main/src/basic/user-util.c并观察到修改后的systemd
服务正在使用正确的$HOME
变量生成。
到目前为止,符号链接/root
是/home/root
一个很好的解决方法。将默认值切换ROOT_HOME
为/root
可能不是一个坏主意与 Linux 世界的其他部分保持一致。