systemd:环境变量的默认值

j12*_*567 5 init-script environment-variables systemd init.d openrc

我想将一些 OpenRC init 脚本迁移到 systemd,但我认为这是 systemd 中环境变量处理的一般问题。

原始 OpenRC 文件

有一个文件,例如/etc/conf.d/fooservice内容

# FOO 变量的值
# 你可以通过取消注释这一行来覆盖默认值
# FOO=值1

# BAR 变量的值
酒吧=值2

在原始启动脚本中/etc/init.d/fooservice,有

FOO=${FOO:-default_foo_value}
BAR=${BAR:-default_bar_value}

所以,结果是$FOO==default_foo_value$BAR==value2

迁移的 systemd 文件

现在我有 systemd 服务文件/usr/lib/systemd/system/fooservice.service,其中包含

[服务]
EnvironmentFile=/etc/conf.d/fooservice
ExecStart=/usr/bin/fooservice $FOO $BAR

但是有一个问题$FOO是没有初始化为default_foo_value

如果环境文件中没有值,有没有办法告诉 systemd 使用默认值?有没有办法使用具有默认值的中间环境文件或多个链接的环境文件?

解决方案:

这不是好办法。/etc/conf.d/fooservice文件可能不兼容,因为它是“shell 脚本”,而 systemd 需要“环境文件”。在基本赋值中,看似相似,实则不是一回事。

Gentoo对此的首选解决方案是将所有内容放入服务文件和服务配置文件中,而不是使用其他conf.d文件。

工作但不是首选的解决方案:

仅使用此方法来像 systemd 一样快速运行 OpenRC 服务。

/usr/lib/systemd/system/fooservice.service 现在包含

[服务]
环境=“FOO=default_foo_value”
环境=“BAR=default_bar_value”
EnvironmentFile=/etc/conf.d/fooservice
ExecStart=/usr/bin/fooservice $FOO $BAR

int*_*lfx 6

systemd 不是 shell,因此它不支持环境文件中特定于 shell 的替换。它们的格式很简单KEY=VALUE,中间可能有空行和注释。

引用systemd.exec(5)

这些文件中的设置会覆盖使用 Environment= 所做的设置。如果从这些文件中两次设置相同的变量,则将按照指定的顺序读取文件,并且后面的设置将覆盖前面的设置。

因此,您可以通过以下任一方式完成您的任务:

  • 使用多个EnvironmentFile=指令(它们按照规范的顺序相互覆盖)

  • 使用Environment=在服务文件中指定的默认值(任何EnvironmentFile=将覆盖它)