【问题标题】:systemd: "Environment" directive to set PATHsystemd:设置 PATH 的“环境”指令
【发布时间】:2016-05-28 02:52:15
【问题描述】:

systemd 单元文件中设置 PATH 变量的正确方法是什么? 看了几个例子后,我尝试使用下面的格式,但变量似乎没有展开。

Environment="PATH=/local/bin:$PATH"

我正在使用以下版本的 systemd 在 CoreOS 上尝试此操作。

systemd 225
-PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK -SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT -GNUTLS -ACL +XZ -LZ4 +SECCOMP +BLKID -ELFUTILS +KMOD -IDN

【问题讨论】:

    标签: linux systemd coreos


    【解决方案1】:

    您不能在 Environment 指令中使用 EnvVars。整个Environment= 将被忽略。如果你使用EnvironmentFile=,那么指定的文件将被加载而不替换。所以PATH=/local/bin:$PATH正是那样,这可能不是你想要的。

    在 CentOS7 下可以工作。

    # /etc/systemd/system/nagios.service.d/env.conf
    [Service]
    Environment="PATH=/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin"
    
    > sudo systemctl daemon-reload
    > sudo systemctl restart nagios
    > sudo cat /proc/28647/environ
    ...
    PATH=/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
    ...
    

    【讨论】:

    • 这对我有用,唯一的例外是我的 PATH 前面带有 /bin,这违背了设置自定义 PATH 的目的。也就是说,如果我添加Environment="PATH=foo:bar",我最终会得到PATH=/bin:foo:bar 用于我的服务。
    • Juts 将我的评论转化为一个正确的问题:stackoverflow.com/questions/39576006/…
    • 这个答案适用于设置 PATH (Environment="PATH=/local/bin),但不能附加/前置到 PATH (Environment="PATH=/local/bin:$PATH"),对吗?
    • 你是对的@Jérôme。似乎不需要附加到 Environment 。见github.com/systemd/systemd/issues/1082
    • 手册页 systemd.exec freedesktop.org/software/systemd/man/… 中包含一个非常重要的部分,它解释了 systemd 传递给衍生服务的初始环境集是什么引用:由服务管理器启动的进程被执行使用从多个来源组装的环境变量块。由系统服务管理器启动的进程通常不会继承为服务管理器本身设置的环境变量(但这可以通过 PassEnvironment= 进行更改)
    【解决方案2】:

    您可以使用units 部分中的EnvironmentFile= 指令来设置环境变量。

    只需将变量设置为key=value 对即可。

    运行时只是“源”您指定的任何文件。

    您可以使用write_files 指令创建文件。

    【讨论】:

    • write_files 指令?
    • 嗯,那是CoreOS启动配置文件中的特定指令。 :)
    猜你喜欢
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    • 2019-06-08
    • 1970-01-01
    • 2021-11-21
    • 2011-03-31
    • 2016-11-29
    • 2012-10-01
    相关资源
    最近更新 更多