如何将 ~/bin 添加到 systemd 服务的 PATH?

Mar*_*ark 15 systemd

我有一个 systemd 服务,它调用一个tmux在启动时创建会话的 PHP 脚本。

在全球范围内,我拥有最新tmux的发行版 (V>=2.5)。
脚本的USER$HOME/bin/tmux2.0

我需要的是systemd使用tmux用户 $HOME 中的二进制文件。
我已经在 systemd 服务文件中设置了 USER & GROUP 变量,但它似乎调用了全局安装的二进制文件。

是否可以显式设置应为此服务调用调用的二进制文件?

如果可能,我宁愿不开始对 PHP 文件本身的路径进行硬编码。

非常感谢。

mur*_*uru 12

您可以PATH在 systemd 服务中硬编码:

[Service]
Environment=PATH=/home/someUser/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Run Code Online (Sandbox Code Playgroud)

更灵活的是 PAM。与简单地使用相比,这是非常迂回的bash -c '....',但是您可以使用 PAM 来做到这一点。

/etc/pam.d(例如/etc/pam.d/foo)中创建一个新的 PAM 配置并添加:

session    required     pam_env.so user_envfile=some-file user_readenv=1
Run Code Online (Sandbox Code Playgroud)

在 中/home/someUser/some-file,添加:

PATH DEFAULT=/home/someUser/bin:${PATH}
Run Code Online (Sandbox Code Playgroud)

当然,您可以将some-file名称调整为更合理的名称,但其中的路径user_envfile必须相对于用户的主目录(您User=在服务中设置的用户)。

然后在服务文件的[Service]部分中,添加(foo/etc/pam.d之前创建的文件):

PAMName=foo
Run Code Online (Sandbox Code Playgroud)

现在,当您启动服务时(在重新加载等之后),将运行其中的session模块/etc/pam.d/foo,在这种情况下只是pam_env. pam_env将从 中加载环境变量/etc/environment,受 中的约束/etc/security/pam_env.conf,然后从 中加载用户环境~/some-file。由于PATH在 中设置为默认值/etc/environment,因此用户环境预先设置为该默认值。

这里,默认值user_envfileis .pam_environment,它也被其他东西的 PAM 配置读取,比如 SSH 或 LightDM 登录等。我在这里使用了不同的文件,以防你不想影响这些东西。您可以删除user_envfile=...并使用默认~/.pam_environment. 您也可以只使用现有的 PAM 配置,/etc/pam.d其中有user_readenv=1,但其他 PAM 模块可能会导致不必要的副作用。

  • 我真的很欣赏“pam”方法,因为我没有想到它。不幸的是,它为一些相当微不足道的事情带来了巨大的复杂性。你的“PATH”变量实际上与我自己的变量相同,除非我听到的内容与我的方式不同。 (2认同)

Mar*_*ark 9

这看起来非常骇人听闻,但预先$PATH更新似乎可行。
不过,我正在寻找副作用。。。

例子:

ExecStart=/bin/bash -c "PATH=/home/someUser/bin:$PATH exec /usr/bin/php /some/path/to/a/script.php"
Run Code Online (Sandbox Code Playgroud)