如何让 systemd 变量在重启后仍然存在?
How to get systemd variables to survive a reboot?
我有第三方供应商提供的产品。它包括许多服务,它们为其提供 initd 样式的启动脚本。提供的每项服务都有一个脚本。
这些脚本引用 JAVA_HOME、THE_PRODUCT_HOME 等变量。供应商期望我必须手动编辑这些脚本并对正确的值进行硬编码。我宁愿在系统启动时从 systemd 获得的环境变量初始化这些变量。
我知道我可以使用 systemctl edit theService
为每个服务创建覆盖配置文件以提供必要的环境变量(a.k.a。环境变量)但是:
- 有相当多的启动脚本
- 基本变量都一样
- 如果可以的话,我想避免"systemctl edit"使用每个提供的脚本
到目前为止,我已经尝试使用 systemctl set-environment VAR_NAME=some_value
。
这非常有效 - 直到我重新启动系统。似乎以这种方式设置的变量是全局定义的,但不会在重启后继续存在。我也尝试过使用 systemctl daemon-reload
以防需要 "commit" 设置(但它似乎没有保存全局 envirables)。
现在,我已经编辑了每个提供的启动脚本和 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.
证明变量已设置。
#### 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 -> ~] #
系统重启
#### 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 -> ~] #
如上所述,当我重新启动系统时,我使用 systemctl set-environment VAR=value
设置的任何 envirables 都会丢失。
我需要这些变量在重启后仍然存在(无需使用每个服务覆盖文件,也无需获取包含所有变量的文件)
解决这个问题的方法有多种。
1。使用 systemd config
设置环境变量
您可以编辑 /lib/systemd/system/system.conf
并添加如下内容
[Manager]
DefaultEnvironment=A=B C=D
2。使用另一个系统服务设置环境变量
[Unit]
Description=Example systemd service init
[Service]
Type=simple
ExecStart=/bin/systemctl set-environment VAR_NAME=some_value
[Install]
WantedBy=sysinit.target
导入点正在使用 WantedBy=sysinit.target
,因此提前加载
现在我们可以创建一个简单的服务来测试它
[Unit]
Description=Example systemd service.
[Service]
Type=simple
ExecStart=/usr/bin/env
[Install]
WantedBy=multi-user.target
结果
root@vagrant:/lib/systemd/system# systemctl status tarun
● tarun.service - Example systemd service.
Loaded: loaded (/lib/systemd/system/tarun.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Sat 2019-06-15 11:31:17 UTC; 5s ago
Process: 1712 ExecStart=/usr/bin/env (code=exited, status=0/SUCCESS)
Main PID: 1712 (code=exited, status=0/SUCCESS)
Jun 15 11:31:17 vagrant systemd[1]: Started Example systemd service..
Jun 15 11:31:17 vagrant env[1712]: A=B
Jun 15 11:31:17 vagrant env[1712]: C=D
Jun 15 11:31:17 vagrant env[1712]: LANG=en_US.UTF-8
Jun 15 11:31:17 vagrant env[1712]: PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Jun 15 11:31:17 vagrant env[1712]: VAR_NAME=some_value
我有第三方供应商提供的产品。它包括许多服务,它们为其提供 initd 样式的启动脚本。提供的每项服务都有一个脚本。
这些脚本引用 JAVA_HOME、THE_PRODUCT_HOME 等变量。供应商期望我必须手动编辑这些脚本并对正确的值进行硬编码。我宁愿在系统启动时从 systemd 获得的环境变量初始化这些变量。
我知道我可以使用 systemctl edit theService
为每个服务创建覆盖配置文件以提供必要的环境变量(a.k.a。环境变量)但是:
- 有相当多的启动脚本
- 基本变量都一样
- 如果可以的话,我想避免"systemctl edit"使用每个提供的脚本
到目前为止,我已经尝试使用 systemctl set-environment VAR_NAME=some_value
。
这非常有效 - 直到我重新启动系统。似乎以这种方式设置的变量是全局定义的,但不会在重启后继续存在。我也尝试过使用 systemctl daemon-reload
以防需要 "commit" 设置(但它似乎没有保存全局 envirables)。
现在,我已经编辑了每个提供的启动脚本和 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.
证明变量已设置。
#### 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 -> ~] #
系统重启
#### 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 -> ~] #
如上所述,当我重新启动系统时,我使用 systemctl set-environment VAR=value
设置的任何 envirables 都会丢失。
我需要这些变量在重启后仍然存在(无需使用每个服务覆盖文件,也无需获取包含所有变量的文件)
解决这个问题的方法有多种。
1。使用 systemd config
设置环境变量您可以编辑 /lib/systemd/system/system.conf
并添加如下内容
[Manager]
DefaultEnvironment=A=B C=D
2。使用另一个系统服务设置环境变量
[Unit]
Description=Example systemd service init
[Service]
Type=simple
ExecStart=/bin/systemctl set-environment VAR_NAME=some_value
[Install]
WantedBy=sysinit.target
导入点正在使用 WantedBy=sysinit.target
,因此提前加载
现在我们可以创建一个简单的服务来测试它
[Unit]
Description=Example systemd service.
[Service]
Type=simple
ExecStart=/usr/bin/env
[Install]
WantedBy=multi-user.target
结果
root@vagrant:/lib/systemd/system# systemctl status tarun
● tarun.service - Example systemd service.
Loaded: loaded (/lib/systemd/system/tarun.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Sat 2019-06-15 11:31:17 UTC; 5s ago
Process: 1712 ExecStart=/usr/bin/env (code=exited, status=0/SUCCESS)
Main PID: 1712 (code=exited, status=0/SUCCESS)
Jun 15 11:31:17 vagrant systemd[1]: Started Example systemd service..
Jun 15 11:31:17 vagrant env[1712]: A=B
Jun 15 11:31:17 vagrant env[1712]: C=D
Jun 15 11:31:17 vagrant env[1712]: LANG=en_US.UTF-8
Jun 15 11:31:17 vagrant env[1712]: PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Jun 15 11:31:17 vagrant env[1712]: VAR_NAME=some_value