systemd $HOME 环境变量与预期不同

systemd $HOME 环境变量与预期不同

我有一个以 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被设置为。/rootmyservice

但是,作为 root 用户,我得到:

$ echo $HOME
/home/root

这与我所看到的一致/etc/passwd

root:x:0:0:root:/home/root:/bin/sh

当我myservice手动运行时,它会获取正确的$HOME环境变量并且可以工作。

我愿意$HOME成为/home/root,但不是/root。所以...

  1. 从哪里systemd获取/root,为什么会$HOME被覆盖?
  2. systemd除了$HOME在服务文件中显式设置环境变量之外,如何防止在全局范围内执行此操作? <-- 在查看源代码后,这似乎不会产生影响

答案1

检查源代码后,我发现systemd实际上homeroot用户硬编码了目录。我还没有找到任何可以更改此设置的配置文档,因此对于使用默认主目录的 Yocto 项目来说,需要注意这一点。

我通过将硬编码/root值修改为/home/rootin来确认这一点https://github.com/systemd/systemd/blob/main/src/basic/user-util.c并观察到修改后的systemd服务正在使用正确的$HOME变量生成。

到目前为止,符号链接/root/home/root一个很好的解决方法。将默认值切换ROOT_HOME/root可能不是一个坏主意与 Linux 世界的其他部分保持一致

相关内容