如何在 systemd exec 命令中获取 $(logname) ?

如何在 systemd exec 命令中获取 $(logname) ?

我正在编写一个 systemd 服务 ( /etc/systemd/system/name.service)。该服务执行放置在~/folder/script.sh.我无法在命令~/内部使用ExecStart,所以我使用/home/$(logname)/folder/script.sh但它不起作用。

答案1

Systemd 的运行级别低于 shell 环境。我的意思是,当您执行命令时,它通常是 shell 环境的子进程,它是 init 守护进程(在本例中为 systemd)的子进程。这意味着 systemd 单元看不到或服从您的 shell 环境,也看不到像~.在文件中配置的任何环境变量(例如~/.profile或 )~/.bashrc都不适用。看什么apply 你可以输入命令systemctl show-environment。在我的系统(Ubuntu Server 和 Arch)上,这是PATHLANG。更多信息这里

对于用户单元来说,这一切(或多或少)都是如此……但是 systemd 为用户单元维护了一个稍微更健壮的环境,正如您应该在systemctl show-environment --user.如果您运行了最后一个命令,它应该已经给出了您需要执行的操作。 Systemd(至少在我的系统上)将环境变量设置USER为正在执行单元的用户的用户名。因此,将您的 ExecStart 行更改为/home/${USER}/folder/script.sh.应该可以做到这一点。另请注意,我没有使用(& )...根据 systemd 手册页,这不是必需的。大括号 ( {& }) 是为了防止由于某些非常奇怪的原因,您的用户名中有空格。即使${HOME}/folder/script.sh用户的主目录不在/home/.

相关内容