如何在 systemd 服务文件中使用 `$HOME` 环境变量

如何在 systemd 服务文件中使用 `$HOME` 环境变量

我正在尝试使用$HOME中的环境变量ExecStart。我尝试了很多不同的方法,例如$HOME${HOME}但似乎都没有用

ExecStart=${HOME}/bin/some-binary

有人知道这个的正确格式吗?

答案1

我想这就是你要找的东西:https://www.freedesktop.org/software/systemd/man/systemd.unit.html#Specifiers

具体来说,%h应该扩展到当前用户的主目录。

答案2

受支持的变量的完整列表(称为“说明符”)如下:https://www.freedesktop.org/software/systemd/man/systemd.unit.html#Specifiers

没有指定服务运行用户的主目录(由 指定的目录User=)。运行服务管理器的用户只有一个主目录。

来自链接:

%h运行服务管理器的用户例如。对于系统管理员,这将解析为“ /root”。请注意,此设置是不是User=受服务单元的[服务]部分中可配置的设置的影响。

答案3

因此,由于缺乏实际的例子和评论,让人感觉好像%h不起作用(确实如此),这是一个从 HOME 目录启动且无需硬编码的服务的完整示例。

鉴于:

  • 脚本~/test.sh

    #!/bin/bash
    echo hello
    
  • 服务文件~/.config/systemd/user/test.service

    [Unit]
    Description=Test
    
    [Service]
    Type=oneshot
    ExecStart=%h/test.sh
    
    [Install]
    WantedBy=multi-user.target
    

然后执行systemctl --user daemon-reload && systemctl --user start test将使其启动并打印hello到日志。

它使用%h其他答案中提到的说明符,并记录为This is the home directory of the user running the service manager instance. […]。因此,除非您以其他用户身份运行用户服务,否则这应该可以工作。

测试的 Systemd 版本:

  • systemd 253 (253.1-3-arch)
  • systemd 237

答案4

你可以使用

WorkingDirectory=~

并设置相对路径。

相关内容