Python中supervisor加载系统环境变量的问题如何解决?
我用 supervisor 管理大概十多个进程,supervisor 处于启动状态。
新添加了一个进程,这个进程使用的环境变量我放到了/etc/profile.d/文件夹下,文件名为*.sh。然后添加 supervisor 配置,启动 supervisorctl,执行,update,新的进程在启动的时候无法读取/etc/profile.d/下 export 的环境变量,进程启动失败。想来想去不知道什么原因....
但是在 shell 环境下,直接启动进程,是可以读取到这些环境变量的,就是 supervisor 启动进程的时候获取不到...
求大神们解惑....
Python中supervisor加载系统环境变量的问题如何解决?
我是直接上 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 reread和supervisorctl 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 是什么意思?

