![收到 HUP 信号后 gunicorn 无法完全重新加载](https://linux22.com/image/647831/%E6%94%B6%E5%88%B0%20HUP%20%E4%BF%A1%E5%8F%B7%E5%90%8E%20gunicorn%20%E6%97%A0%E6%B3%95%E5%AE%8C%E5%85%A8%E9%87%8D%E6%96%B0%E5%8A%A0%E8%BD%BD.png)
我正在尝试在 vagrant 上设置一个有效的 Supervisor/gunicorn/django。我正在使用 python-watchdog 尝试在代码发生更改时重新启动 gunicorn。
我正在为 gunicorn 使用以下主管配置:
[program:someapp]
environment=PYTHONPATH='/vagrant/libs/unmodified/django-error-capture-middleware/src:/vagrant:/home/vagrant/.virtualenvs/someapp/lib/python2.7/site-packages:/vagrant/wsgi',DJANGO_SETTINGS_MODULE=someapp.settings.vagrant
command=/home/vagrant/.virtualenvs/someapp/bin/gunicorn --bind 0.0.0.0:80 --pid=/home/vagrant/.gunicorn.pid --preload --workers=1 --debug --log-level debug --error-logfile - --access-logfile - vagrant_wsgi:application
user=root
group=root
redirect_stderr=true
stdout_logfile = /vagrant/logs/gunicorn.log
stderr_logfile = /vagrant/logs/gunicorn.log
stdout_logfile_maxbytes=0
autostart=true
autorestart=true
stdout_events_enabled=true
loglevel=debug
这一切都运行正常。看门狗也运行正常。但是,当我使用看门狗运行时kill -HUP [pidofgunicorn]
,有时它实际上不会完全重新加载。有时 django 甚至会报告模块丢失,而它们之前是存在的(我根本没有修改 sys.path)。
如果我使用 watchdog 来运行supervisorctl restart someapp
,它工作正常。但是,它需要更长的时间,特别是在 virtualbox 实例上。
我可以做些什么来让 gunicorn 正常重新加载,并且真正看到所做的更改?
答案1
问题在于--preload参数。
这第一的解决方案是不使用--preload。
这第二解决方法如下:
# Reload a new master with new workers
kill -s USR2 $PID
# Graceful stop old workers
kill -s WINCH $OLDPID
# Graceful stop old master
kill -s QUIT $OLDPID
这第三解决方案是使用包https://github.com/flupke/rainbow-saddle与supervisord配合良好。