是否可以为某些服务导出环境变量?

是否可以为某些服务导出环境变量?

说我有两个服务,它们是在系统(Ubuntu 16.04.3)启动时自动启动两个进程。

一份服务文件:

[Unit]
Description=service 1
Requires=init_mdc.service
After=rc.local.service init_mdc.service


[Service]
ExecStart=someCmd
ExecReload=someCmd
KillMode=process
Restart=on-failure
Type=simple

另一个服务文件:

[Unit]
Description=service 2
Requires=init_mdc.service
After=rc.local.service init_mdc.service


[Service]
ExecStart=someCmd2
ExecReload=someCmd2
KillMode=process
Restart=on-failure
Type=simple

这两个服务需要一些相同的环境变量。

目前我的解决方案还不好,因为someCmd两个服务的s是两个不同的bash脚本,我在其中设置了相同的env变量。

我在想是否可以以某种方式在某个地方设置一些环境变量,以便两个服务可以共享它们,换句话说,我只想设置环境变量一次,而不是两次。

我尝试从/etc/profile、 from导出这些环境变量/etc/rc.local,但它们不起作用。我认为这是因为系统首先运行我的两个服务,然后/etc/profile/etc/rc.local系统读取。

有没有一种方法可以让我为多个服务文件设置一些环境变量?我知道我们可以在服务文件中设置来导入一些环境变量,但我不喜欢这样,因为我仍然必须为每个服务EnvironmentFile=XXX设置多次......EnvironmentFile=XXX

答案1

使用EnvironmentFile=才是出路。

我不明白您关于必须多次设置它的观点...您必须从需要这些变量的每个服务中设置一次...

服务一:

[Unit]
Description=service 1

[Service]
ExecStart=someCmd
EnvironmentFile=/path/to/common.env
...

服务二:

[Unit]
Description=service 2

[Service]
ExecStart=someCmd2
EnvironmentFile=/path/to/common.env
...

并将所有VAR=VALUE设置保存在文件中/path/to/common.env

环境文件的语法与 shell 脚本的语法兼容,因此您甚至可以在自己的环境中获取它.bash_profile

# ~/.bash_profile
if [ -f /path/to/common.env ]; then
    . /path/to/common.env
fi

一种替代方法是在 PID 1 中使用systemctl set-environmentsystemctl import-environment设置全局环境变量。(请参阅文档这里.)

您可能仍然需要PassEnvironment=在特定服务中导出这些变量,但在这种情况下,您只需要列出变量名称。

我真的不认为这是最好的解决方案,我认为EnvironmentFile=它更加独立、优雅并且适合您的用例。

相关内容