gunicorn não está recarregando totalmente após um sinal HUP

6

Estou tentando obter um supervisor de trabalho / gunicorn / django setup no vagrant. Estou usando o python-watchdog para tentar reiniciar o gunicorn quando ocorrerem alterações de código.

Estou usando a seguinte configuração de supervisor para 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

Isso tudo funciona muito bem. O watchdog também funciona bem. No entanto, quando eu uso o watchdog para executar um kill -HUP [pidofgunicorn] , às vezes ele não é recarregado totalmente. Às vezes, o django até relatará que os módulos estão faltando quando eles estavam lá anteriormente (eu não modifiquei o sys.path).

Se eu usar o watchdog para executar um supervisorctl restart someapp , funcionará bem. No entanto, demora muito mais, especialmente na instância do virtualbox.

Há algo que eu possa fazer para que o gunicorn seja recarregado normalmente e realmente veja as mudanças que foram feitas?

    
por synic 11.12.2014 / 19:02

1 resposta

8

O problema é o parâmetro --preload.

A solução primeiro não é usar o --preload.

A solução second deve seguir isto:

# 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

A terceira solução é usar o link que funciona bem com o supervisord

    
por 12.01.2015 / 15:02