如何获取systemd变量以在重新启动后幸免?

GMc*_*GMc 6 linux redhat environment-variables systemd

我有一个第三方供应商提供的产品。它包括许多服务,它们为其提供了indd风格的启动脚本。每个提供的服务都有一个脚本。

这些脚本引用变量,例如JAVA_HOME,THE_PRODUCT_HOME等。供应商期望我必须手动编辑这些脚本并对正确的值进行硬编码。我宁愿这些变量是从系统启动时从systemd获得的环境变量初始化的。

我知道我可以使用以下命令为每个服务创建覆盖配置文件,以提供必要的环境(即环境变量)systemctl edit theService

  1. 有很多启动脚本
  2. 基本变量都一样
  3. 如果可以,我想避免对每个提供的脚本进行“ systemctl编辑”

到目前为止,我已经尝试使用systemctl set-environment VAR_NAME=some_value

这非常有效-直到我重新启动系统。似乎以这种方式设置的变量是全局定义的,但在重启后无法生存。我还尝试过使用systemctl daemon-reload,以防万一需要“提交”设置(但它似乎并不能保存全局​​环境)。

现在,我已经编辑了提供的每个启动脚本,并且 source /path/to/theGlobalVariablesINeed.sh

这种方法可以很好地解决,但不是我今后首选的解决方案...

这是发生的情况的说明:

定义一些变量

[root@dav1-td1 -> ~] # systemctl show-environment
LANG=en_US.UTF-8
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
[root@dav1-td1 -> ~] #

[root@dav1-td1 -> ~] # systemctl set-environment SYSD_PRODNAME_JAVA_HOME=/usr/java/jdk1.8.0_181-amd64/jre
[root@dav1-td1 -> ~] # systemctl set-environment SYSD_PRODNAME_HOME=/opt/TheProduct-1.2.3
[root@dav1-td1 -> ~] # systemctl daemon-reload        # This is optional, if I run the reload, or do not run the reload, the variables are still lost over a reboot.
Run Code Online (Sandbox Code Playgroud)

演示变量已设置。

#### Now some variables are set, If I restart a service, the service will
#### Pick up these environmental variable settings.

[root@dav1-td1 -> ~] # systemctl show-environment
LANG=en_US.UTF-8
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
SYSD_PRODNAME_HOME=/opt/TheProduct-1.2.3
SYSD_PRODNAME_JAVA_HOME=/usr/java/jdk1.8.0_181-amd64/jre
[root@dav1-td1 -> ~] #
Run Code Online (Sandbox Code Playgroud)

系统重启

#### After restart, the variables have disappeared !?!?

[root@dav1-td1 -> ~] # systemctl show-environment
LANG=en_US.UTF-8
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
[root@dav1-td1 -> ~] #

Run Code Online (Sandbox Code Playgroud)

如上所述,当我重新启动系统时,我设置的所有可使用环境都会systemctl set-environment VAR=value丢失。

我需要这些变量才能在重新启动后幸存(无需使用每项服务覆盖文件,而不必获取包含所有变量的文件)

Tar*_*ani 6

有多种方法可以解决此问题。

1.使用systemd config设置环境变量

您可以编辑/lib/systemd/system/system.conf和添加如下内容

[Manager]
DefaultEnvironment=A=B C=D
Run Code Online (Sandbox Code Playgroud)

2.使用另一个systemd服务设置环境变量

[Unit]
Description=Example systemd service init

[Service]
Type=simple
ExecStart=/bin/systemctl set-environment VAR_NAME=some_value

[Install]
WantedBy=sysinit.target
Run Code Online (Sandbox Code Playgroud)

导入点正在使用中,WantedBy=sysinit.target因此需要提前加载

现在我们可以创建一个简单的服务来测试

[Unit]
Description=Example systemd service.

[Service]
Type=simple
ExecStart=/usr/bin/env

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

和结果

[Manager]
DefaultEnvironment=A=B C=D
Run Code Online (Sandbox Code Playgroud)