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