Eu tenho um problema ao implantar o aplicativo Django usando Gunicorn e Supervisor. Embora eu possa fazer o Gunicorn servir meu aplicativo (definindo o PYTHONPATH adequado e executando o comando apropriado, o da configuração supervisord), não posso fazer o supervisor executá-lo. Ele simplesmente não verá meu aplicativo. Eu não sei como ter certeza se o arquivo de configuração está ok.
Aqui está o que supervisorctl diz:
# supervisorctl start myapp_live
myapp_live: ERROR (no such process)
Estou executando-o no Ubuntu 10.04 com a seguinte configuração:
Arquivo /home/myapp/live/deploy/supervisord_live.ini:
[program:myapp_live]
command=/usr/local/bin/gunicorn_django --log-file /home/myapp/logs/gunicorn_live.log --log-level info --workers 2 -t 120 -b 127.0.0.1:10000 -p deploy/gunicorn_live.pid webapp/settings_live.py
directory=/home/myapp/live
environment=PYTHONPATH='/home/myapp/live/eco/lib'
user=myapp
autostart=true
autorestart=true
Em /etc/supervisor/supervisord.conf, no final do arquivo, há:
[include]
files = /etc/supervisor/conf.d/*.conf
e aqui está um link simbólico para o meu arquivo de configuração:
# ls -la /etc/supervisor/conf.d
lrwxrwxrwx 1 root root 48 Dec 4 18:02 myapp-live.conf -> /home/myapp/live/deploy/supervisord_live.ini
tudo parece bem para mim, mas supervisorctl continua dizendo myapp_live: ERROR (no such process)
. Alguma solução para isso?
A resposta correta é que o supervisor exige que você releia e atualize quando colocar um novo arquivo de configuração. Reiniciar não é a resposta, pois isso afetará outros serviços. Tentar:
Eu tive o mesmo problema, um
fez o truque, embora eu não saiba se essa é a resposta para sua pergunta.
Certifique-se de que seus arquivos conf do supervisor terminem em .conf
Demorei um pouco para descobrir isso. Espero que ajude a próxima pessoa.
Recarregar o processo do supervisor mestre pode funcionar, mas terá efeitos colaterais indesejados se você tiver mais de um processo sendo monitorado pelo supervisor.
A maneira correta de fazer isso é emitir o
supervisorctl reread
que faz com que ele verifique os arquivos de configuração em busca de alterações:Em seguida, basta recarregar esse aplicativo:
Eu tive um problema semelhante (
myapp_live: ERROR (no such process)
) e foi porque minha definição de processo foiquando deveria ter sido
Embora isso não aborde a pergunta que foi feita, fui conduzido aqui pela Pesquisa que procura uma solução para o meu problema, portanto, espero que outras pessoas também a encontrem aqui.
Encontrei esse problema usando o pacote supervisor, versão 3.0a8-1.1 do Ubuntu Server 12.10. Acabei resolvendo o problema lendo a ajuda interna:
Em particular, você deseja usar a sintaxe:
Como a documentação afirma em http://supervisord.org/configuration.html#programx-section -- "Uma seção [program:x] na verdade representa um "grupo de processos homogêneo" para o supervisor (a partir de 3.0)." Então, talvez o problema tenha surgido pela primeira vez na versão 3.0.
PS: Sou novo como supervisor; Estou usando https://github.com/bdarnell/tornado-production-skeleton/blob/8ad055457646929c0e8f48aaf20d98f054b1787b/production/chat.supervisor como um exemplo de como deve ser uma configuração mínima.
Aqui está uma lista de verificação:
O novo arquivo de configuração deve ser nomeado de acordo com o padrão de inclusão configurado em /etc/supervisord.conf:
Como vemos no meu caso, spam.ini seria incluído, mas spam.conf não.
Se você criou o novo arquivo copiando um antigo, certifique-se de realmente alterar a
[program:]
linha. Porque se você for tão estúpido quanto ter dois arquivos para o mesmo programa,supervisorctl reread
vai te deixar com essa mensagem de erro sem esperança como punição:Se seu arquivo for detectado,
supervisorctl reread
deve dizer algo como:Em seguida,
supervisorctl update spam
deve iniciá-lo e fazê-lo aparecer emsupervisorctl status
.Descobri que os scripts init.d não são confiáveis em várias versões diferentes do Ubuntu/Debian. A maneira de fazer é esta:
Achei esta solução mais conveniente:
EDIT: antes de fazer isso, verifique o caminho do supervisorctl usando
which supervisorctl
para garantir que você esteja adicionando o caminho certo aos sudoers.Adicione esta linha ao arquivo sudoers usando
visudo
(onde:myappuser
- o usuário que precisa reiniciar seu aplicativo,myapp
- nome do aplicativo):E então simplesmente:
Você não está vinculado aos scripts de inicialização da distribuição e concede privilégios bastante restritos ao usuário que reinicia seu aplicativo gunicorn. Além disso, você não precisa se preocupar com pid. O comando não solicitará senha, portanto, é adequado para scripts bash/fabric de implantação automática. Por outro lado - você deve estar ciente de que, se supervisorctl estiver vulnerável a algum bug causando execução de código, um usuário mal-intencionado pode usar esse privilégio sudo para executar código como root (mas até onde eu sei, nenhum bug foi descoberto para supervisord e é uma grande coisa encontrar tal vulnerabilidade).
Lendo o código de supervisorctl.py aqui: https://github.com/Supervisor/supervisor/blob/master/supervisor/supervisorctl.py
Você pode ver que supervisorctl update (função do_update) está chamando reloadConfig() exatamente como supervisorctl reread (função do_reread) faz.
Então eu acho que chamar reread não é necessário se você chamar update depois dele.
A partir da saída do git culpado, tem sido assim desde pelo menos julho de 2009.