Ini*_*ian 8 environment-variables systemd
我正在尝试将当前 shell 中定义的环境变量传递给systemd
我正在编写的单元之一。
DB_URL=databus.dev.mysite.io:8080
Run Code Online (Sandbox Code Playgroud)
我在作为服务运行的 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
Run Code Online (Sandbox Code Playgroud)
在 Python 脚本中使用变量的方式是
if os.environ.get('DB_URL') is not None:
dbEndPoint = "http://" + os.environ['DB_URL']
Run Code Online (Sandbox Code Playgroud)
问题是在systemd
. 我查找了几个资源在 systemd 单元中使用环境变量,它说[Service]
直接在下面使用赋值作为
[Service]
Environment=DB_URL=databus.dev.mysite.io:8080
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我的机器DB_URL
可能会根据我部署机器的环境而改变,它可能是开发人员,也可能是生产设置,其中 URL 会有所不同。
我如何动态地做到这一点?即传递任何可DB_URL
用于systemd
环境的值?
我还尝试使用该EnvironmentFile=
选项来定义文件并将其传递给服务。但同样的问题,我的变量可能是动态的,不能硬编码。
使用该选项后
systemctl import-environment DB_URL
Run Code Online (Sandbox Code Playgroud)
我能够看到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
Run Code Online (Sandbox Code Playgroud)
但该值仍然没有反映在python
我运行的应用程序中。os.environ('DB_URL')
访问变量的方式是错误的吗?
meu*_*euh 19
您可以使用以下命令影响所有未来命令的全局 systemd 环境(直到重新启动)
sudo systemctl set-environment var=value
Run Code Online (Sandbox Code Playgroud)
或者如果您已经var
在您的环境中导出,则可以使用
sudo systemctl import-environment var
Run Code Online (Sandbox Code Playgroud)
启动单元后,您可以unset-environment
类似地删除变量。
由于这实际上是全局的,因此您最好将行DB_URL=databus.dev.mysite.io:8080
写入某个文件/some/file
并EnvironmentFile=/some/file
在您的单元中进行设置。
另一种方法是使用myunit@.service
以systemctl start myunit@'databus.dev.mysite.io:8080'
. 然后,您可以%i
在单元内部恢复此参数,例如在[Service]
具有以下行的部分中:
Environment=DB_URL=%i
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
17388 次 |
最近记录: |