【问题标题】:How to get systemd variables to survive a reboot?如何让 systemd 变量在重启后仍然存在?
【发布时间】:2019-10-22 12:59:39
【问题描述】:

我有一个由第三方供应商提供的产品。它包括许多为其提供 initd 样式启动脚本的服务。提供的每项服务都有一个脚本。

这些脚本引用 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.

证明变量已设置。

#### 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 都会丢失。

我需要这些变量在重启后仍然存在(无需使用每个服务覆盖文件,也无需获取包含所有变量的文件)

【问题讨论】:

    标签: linux environment-variables redhat systemd


    【解决方案1】:

    有不同的方法可以解决这个问题。

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

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

    [Manager]
    DefaultEnvironment=A=B C=D
    

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

    [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
    

    【讨论】:

    • 谢谢@Tarun_Lalwani - 我不敢相信我花了好几天的时间阅读手册页、在线搜索、试错并找到我新的东西很简单 - 但就是看不到。你是“不管是什么”,让我在大海捞针!再次感谢。
    • 希望我的问题(和你的回答)将来能帮助到其他人!
    • @GMc,很高兴为您提供帮助 :-)
    猜你喜欢
    • 1970-01-01
    • 2013-10-03
    • 2021-06-15
    • 2019-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    相关资源
    最近更新 更多