将环境变量传递给以 systemctl 启动的服务

Nic*_*ury 4 systemd

我有一个使用 NodeJs 构建的 nodeJS 服务。此服务需要将一些环境变量传递给它。此外,我创建了一个 systemd 单元文件以从 systemctl 启动它。由于一些奇怪的原因,该服务在使用 systemctl 启动时不会读取环境变量。例如,一个环境变量是 HOST,它包含将绑定 Sails 应用程序的 IP。但是,如果我启动该服务与帆解除节点app.js,它读取环境变量。这是单元文件:

[Unit]
Description=project

[Service]
ExecStart=/usr/bin/node /mnt/project/app.js
Restart=always
StandardOutput=syslog

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

我尝试了一切。我将环境变量添加到 /etc/environment 并将单元文件指向它,我也将它们添加到单元文件中,但没有任何效果。

小智 6

发生这种情况是因为 systemd 中的一个单元是从系统的其余部分封装的。您是否尝试过像这样直接在单元文件中设置它?

Environment="FOO=foo" 'BAR=bar'

然后变量 FOO 和 BAR 在您的单元中可用。例如,如果这是我的 ExecuteStart:

ExecStart=/bin/echo $FOO ${FOO} ${BAR}

使用Environment上面的选项,这将导致以下输出:

foo foo 酒吧

另一种方法是通过环境配置文件来完成。为此,您可以阅读 Fedora 文档:

http://fedoraproject.org/wiki/Packaging:Systemd#EnvironmentFiles_and_support_for_.2Fetc.2Fsysconfig_files

此链接包含一些有用的 docker 示例:

https://coreos.com/os/docs/latest/using-environment-variables-in-systemd-units.html

  • 奇迹般有效 (3认同)