Supervisor无法找到NET-SNMP已安装MIB文件的Flask RESTAPI问题
解决Supervisor启动Flask+NET-SNMP时找不到MIB文件的问题
嘿,这个问题我之前帮朋友排查过,核心就是Supervisor启动进程时的环境和你手动登录shell时的环境不一样!手动跑Gunicorn正常是因为你登录后shell加载了用户的环境变量,但Supervisor默认不会加载这些,导致NET-SNMP找不到.snmp目录里的MIB文件。下面给你几个可行的解决思路:
方法一:直接在Supervisor配置里加环境变量
修改你的Supervisor配置项,把需要的环境变量明确写进去,这样进程启动时就能拿到正确的路径了。调整后的配置大概是这样:
[program:app] command = /home/web/www/venv/bin/python3.6 /home/web/www/venv/bin/gunicorn app:app -b localhost:8000 directory = /home/web/www/app user = web # 重点加这行,指定HOME和SNMP相关的环境变量 environment = HOME="/home/web", MIBDIRS="/home/web/.snmp/mibs", SNMPCONFPATH="/home/web/.snmp"
HOME:告诉进程用户web的主目录在哪,NET-SNMP默认会从这里找.snmp文件夹MIBDIRS:直接指定MIB文件的存放目录,省得NET-SNMP瞎找SNMPCONFPATH:指定SNMP配置文件的路径
改完配置后,记得重启Supervisor让它生效:
sudo supervisorctl reread sudo supervisorctl update sudo supervisorctl restart app
方法二:写个启动脚本先设环境变量
如果不想动Supervisor的配置,也可以搞个简单的shell脚本,先把环境变量设置好再启动Gunicorn。步骤如下:
- 在你的app目录下创建
start_app.sh:
#!/bin/bash # 先把需要的环境变量设好 export HOME="/home/web" export MIBDIRS="/home/web/.snmp/mibs" export SNMPCONFPATH="/home/web/.snmp" # 再启动Gunicorn /home/web/www/venv/bin/gunicorn app:app -b localhost:8000
- 给脚本加执行权限:
chmod +x /home/web/www/app/start_app.sh
- 然后把Supervisor的
command改成指向这个脚本:
[program:app] command = /home/web/www/app/start_app.sh directory = /home/web/www/app user = web
同样重启Supervisor就行。
方法三:先验证环境变量是否生效
要是不确定环境变量有没有设置对,可以在Flask里加个小接口,打印相关的环境变量看看:
from flask import Flask import os app = Flask(__name__) @app.route('/check-env') def check_snmp_env(): # 只打印和SNMP相关的环境变量 snmp_envs = {} for key in ['HOME', 'MIBDIRS', 'SNMPCONFPATH']: snmp_envs[key] = os.environ.get(key, '未设置') return snmp_envs if __name__ == '__main__': app.run()
启动后访问localhost:8000/check-env,就能看到这些变量是不是你想要的值了。
额外提醒
最后别忘了检查一下.snmp目录的权限,确保用户web能读里面的文件:
sudo chown -R web:web /home/web/.snmp sudo chmod -R 755 /home/web/.snmp
要是MIB文件是放在.snmp/mibs下面,也确认下文件名后缀是.mib或者.txt,NET-SNMP认这些格式。
内容的提问来源于stack exchange,提问作者plejon
相关产品推荐
相关产品推荐

