Python中supervisor加载系统环境变量的问题如何解决?

我用 supervisor 管理大概十多个进程,supervisor 处于启动状态。

新添加了一个进程,这个进程使用的环境变量我放到了/etc/profile.d/文件夹下,文件名为*.sh。然后添加 supervisor 配置,启动 supervisorctl,执行,update,新的进程在启动的时候无法读取/etc/profile.d/下 export 的环境变量,进程启动失败。想来想去不知道什么原因....

但是在 shell 环境下,直接启动进程,是可以读取到这些环境变量的,就是 supervisor 启动进程的时候获取不到...

求大神们解惑....


Python中supervisor加载系统环境变量的问题如何解决?

8 回复

我是直接上 systemd 的,如果在 systemd 中遇到这样的问题,定义一下
[Service]
EnvironmentFile=

就解决了。


在Python项目里用supervisor管理进程时,如果进程需要读取系统环境变量,直接在supervisor配置里设置就行。关键是在[program:your_program]配置段里用environment参数。

比如你有个Flask应用,需要DATABASE_URL这个环境变量,配置可以这么写:

[program:my_flask_app]
command=/path/to/venv/bin/gunicorn -w 4 app:app
directory=/path/to/your/app
user=your_user
environment=DATABASE_URL="postgresql://user:pass@localhost/dbname",OTHER_VAR="value"
autostart=true
autorestart=true

这里environment后面跟的是键值对,多个变量用逗号隔开,和shell里设置环境变量格式差不多。

重要提醒:改完配置一定要用supervisorctl rereadsupervisorctl update让配置生效,重启相关进程可以用supervisorctl restart program_name

如果系统环境变量已经存在,想在supervisor里直接继承,目前supervisor没有内置支持。变通方法是写个简单的包装脚本,比如start.sh

#!/bin/bash
exec /path/to/venv/bin/gunicorn -w 4 app:app

然后在supervisor配置里用这个脚本作为command,并设置user为有相应环境变量的用户。

总结:直接在supervisor配置的environment参数里设置最直接可靠。

正常,supervisor 启动的时候是 /etc/init.d,所以环境变量根本没有加载起来。
你在你的启动脚本里加上就可以了

“无法读取”是你理解有问题
根本就不会去那读取

profile 是给 shell 用的。你这又没用到 shell

你可以使用 配置文件里面的关键字 environment 来添加你需要使用的那个 python 来指定你启动的环境变量。同理可以添加别的环境变量信息。

楼主解决了吗?

在 supervisor 配置文件.conf 中 加上 environment=PYTHONPATH=/opt/mypypath:%(ENV_PYTHONPATH)s,PATH=/opt/mypath:%(ENV_PATH)s
参考 https://stackoverflow.com/questions/12900402/supervisor-and-environment-variables

%(ENV_PATH)s 最后这个 s 是什么意思?

回到顶部