将环境变量从当前 shell 传递到 systemd 单元

将环境变量从当前 shell 传递到 systemd 单元

我试图将当前 shell 中定义的环境变量传递给systemd我正在编写的单元之一。

DB_URL=databus.dev.mysite.io:8080

我在作为服务运行的 python 脚本中使用它。我的systemd单元将将此脚本作为一个单元运行,并利用该变量进行工作。

[Unit]
Description=device-CompStatus: Computes device availability status
           
[Service]
Type=simple    
ExecStart=/usr/bin/bash -c "/usr/bin/python /opt/deviceCompStatus/deviceCompStatusHandler.py"
Restart=always
         
[Install]
WantedBy=default.target

在Python脚本中使用变量的方式是

if os.environ.get('DB_URL') is not None:
    dbEndPoint = "http://" + os.environ['DB_URL']

问题是在运行脚本时无法使用该变量systemd。我查了一些资源在 systemd 单元中使用环境变量,它说直接使用赋值[Service]作为

[Service]
Environment=DB_URL=databus.dev.mysite.io:8080

正如您所看到的,我的DB_URL可能会根据我部署机器的环境而改变,它可能是开发人员,也可能是生产设置,其中 URL 会有所不同。

我如何动态地执行此操作?即传递任何可用的值给DB_URL环境systemd

我也尝试使用EnvironmentFile=定义文件并将其传递给服务的选项。但同样的问题又来了,我的变量可能是动态的并且不能被硬编码。

更新

使用该选项后

systemctl import-environment DB_URL

我能够看到systemd我确认的环境中可用的变量

systemctl show-environment
DB_URL=databus.dev.mysite.io:8080
LANG=en_US.UTF-8
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin

但该值仍然没有反映在python我运行的应用程序中。os.environ('DB_URL')访问变量的方式是否错误?

答案1

您可以通过使用影响所有未来命令的全局 systemd 环境(直到重新启动)

 sudo systemctl set-environment var=value

或者如果您已经var在您的环境中导出,则可以使用

 sudo systemctl import-environment var

启动设备后,您可以使用unset-environment类似的方法删除变量。

由于这实际上是全局性的,因此您最好只需将该行写入DB_URL=databus.dev.mysite.io:8080某个文件/some/fileEnvironmentFile=/some/file在您的单元中进行设置。

另一种方法是使用[email protected]以 开头的模板单元systemctl start myunit@'databus.dev.mysite.io:8080'。然后,您可以在%i单元内部恢复此参数,例如在[Service]包含以下行的部分中:

Environment=DB_URL=%i

答案2

就其价值而言,systemd 本身的 50-systemd-user.sh 提供了一种导入环境变量 DISPLAY 和 XAUTHORITY 的方法,您可以参考:

#!/bin/sh                                                                                                                                                                                                    

systemctl --user import-environment DISPLAY XAUTHORITY

if command -v dbus-update-activation-environment >/dev/null 2>&1; then 
    dbus-update-activation-environment DISPLAY XAUTHORITY
fi

https://github.com/systemd/systemd/blob/master/xorg/50-systemd-user.sh

答案3

如果您在当前终端中设置了环境变量并将其导出到systemctlwith sudo,您可以使用,

sudo -E  systemctl import-environment <LIST OF ENVIRONMENTS TO BE AVAILABLE FOR SERVICE>

相关内容