我已经为它build立了一个应用程序和一个systemd单元。 systemd单元工作正常,但是由于dev和prod环境已经分歧,我开始将configuration移出到环境variables,我似乎无法让他们在systemd中工作。
我已经尝试了系统级的环境variables,而且它们对操作系统是可见的,但不是程序,所以我开始考虑将它们构build到systemd单元中。
首先我尝试使用EnvironmentFile
我创build了一个简单的环境文件
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在那里的环境(与上述相同的格式),但没有…
我的应用程序无法访问这些环境variables。
如果我导出它们(手动在我的shell或使用/etc/profile.d/)并直接运行我的应用程序,它的工作,所以这是不是被设置,而不是一个应用程序的问题。
这是Centos 7.3,我select了环境variables而不是硬编码的configuration,因为它可以运行在linux或windows上,所以不想把configuration文件埋在/ etc /
我在RHEL 7.3上遇到了同样的问题,并发现:
然后,可以在
ExecStart行(和相关行)中使用${FOOBAR}和$FOOBAR引用/etc/sysconfig/httpd文件中设置的variables。
这让我认为Environment和EnvironmentFile的目的根本不是你所期待的(为systemd单元启动的进程设置环境variables),而只适用于立即扩展ExecStart行。
也许我完全脱离基地,这是systemd(我希望如此)的错误。 但是我停止了下一步的尝试,并以另一种方式进行:在我的情况下,我需要设置LD_LIBRARY_PATH ,所以我通过创build/etc/ld.so.conf.d/new_file.conf然后运行ldconfig 。 我也尝试在/etc/profile.d/new_file.sh使用系统范围的variables,但是显然只需要设置LD_LIBRARY_PATH就足够了(mariadb),所以我实际上不知道我设置的variables/etc/profile.d/new_file.sh正在运行。
Environment和EnvironmentFile设置单元可用的variables,但像sh命令一样,不会将其导出到subprocess。 为此,您还需要将其列在PassEnvironment ,就像您使用export shell命令一样。 请参阅EnvironmentFile和PassEnvironment上的systemd文档
另外请注意,EnvironmentFile的内容不是shell脚本,但是键值对看起来太像sh,因此用.sh扩展名来命名是有误导性的。