我想将一些 OpenRC 初始化脚本迁移到 systemd,但我认为这是 systemd 中环境变量处理的普遍问题。
原始 OpenRC 文件
有一个文件,例如/etc/conf.d/fooservice
包含内容
# FOO 变量的值 # 您可以通过取消注释此行来覆盖默认值 # FOO=值1 # BAR 变量的值 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
,其中包含
[服务] 环境文件=/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” 环境文件=/etc/conf.d/fooservice ExecStart=/usr/bin/fooservice $FOO $BAR
答案1
systemd 不是 shell,因此它不支持环境文件中特定于 shell 的替换。它们的格式很简单KEY=VALUE
,中间可能有空行和注释。
去引用系统执行(5):
这些文件中的设置会覆盖使用 Environment= 所做的设置。如果从这些文件中两次设置相同的变量,则将按照指定的顺序读取文件,并且后面的设置将覆盖前面的设置。
因此,您可以通过以下任一方式完成任务:
使用多个
EnvironmentFile=
指令(它们按照规范的顺序相互覆盖)Environment=
在服务文件中使用来指定默认值(任何值EnvironmentFile=
都会覆盖它)