Systemd Environment 和 EnvironmentFile 不起作用

Systemd Environment 和 EnvironmentFile 不起作用

我为其构建了一个应用程序和一个 systemd 单元。systemd 单元运行良好,但随着开发和生产环境的分化,我开始将配置移出到环境变量,但似乎无法让它们在 systemd 中工作。

我已经尝试了系统范围的环境变量,它们对于操作系统可见,但对于程序不可见,所以我开始研究将它们构建到 systemd 单元中。

首先我尝试使用 EnvironmentFile

我创建了一个环境文件,其中只有

LCSQLH=localhost
LCSQLU=application

在其中作为/etc/lc.sh

[Unit]
Description=Service for this app

[Service]
EnvironmentFile=/etc/lc.sh
ExecStart=/usr/bin/env python /opt/app/__init__.py

做了systemctl --system daemon-reload但没有,我的应用程序出错了:

Jan 27 14:24:59 machine.host env[630]: KeyError: 'LCSQLU'

我看到有些有:

EnvironmentFile=-/etc/lc.sh

我试过了...不行...

所以我尝试将它们单独放入

[Service]
Environment="LCSQLH=localhost"
Environment="LCSQLU=application"
ExecStart=/usr/bin/env python /opt/app/__init__.py

再一次,没有……

所以我听说了这个想法,/etc/systemd/service_name.service.d所以我把一个 service.conf 放在里面,并设置环境(与上面相同的格式),但没有......

我的应用程序无法访问这些环境变量。

如果我导出它们(在我的 shell 中手动导出或者使用 /etc/profile.d/)并直接运行我的应用程序,它就可以工作,所以这些没有被设置,而不是应用程序问题。

这是 Centos 7.3,我选择了环境变量而不是硬编码配置,因为它可以在 Linux 或 Windows 上运行,所以不想将配置文件埋在 /etc/ 中

答案1

我在 RHEL 7.3 上遇到了同样的问题,发现

然后,您可以在行(和相关行)中/etc/sysconfig/httpd使用${FOOBAR}和引用文件中设置的变量。$FOOBARExecStart

Environment这让我认为和的目的EnvironmentFile根本不是你和我所期望的(为 systemd 单元启动的进程设置环境变量),而仅适用于该ExecStart行的立即扩展。

也许我完全错了,这是 systemd 中的一个错误(我希望如此)。但我不再按照你尝试的方式去做,而是用另一种方式去做:在我的情况下,我需要设置LD_LIBRARY_PATH,所以我通过创建/etc/ld.so.conf.d/new_file.conf然后运行来做到这一点ldconfig。我还尝试在中使用系统范围的变量/etc/profile.d/new_file.sh,但显然设置LD_LIBRARY_PATH对于这项服务(mariadb)来说已经足够了,所以我实际上不知道我设置的变量是否/etc/profile.d/new_file.sh起作用了。

答案2

EnvironmentEnvironmentFile设置单元可用的变量,但与命令一样sh,不会将其导出到子进程。为此,您还需要将其列在中PassEnvironment,就像使用 shell 命令一样export。请参阅有关 EnvironmentFile 和 PassEnvironment 的 systemd 文档

另外,请注意,EnvironmentFile 的内容不是 shell 脚本,而是看起来很像 sh 的键值对,因此使用扩展名命名.sh会产生误导。

相关内容