Eu tenho um aplicativo Django 1.6.2 que usa o Celery 3.1.7 para tarefas assíncronas. Estou iniciando meus trabalhadores do Celery usando o Supervisor. Até agora tudo está funcionando bem, exceto quando reinicio meu servidor Debian 7.8. Quando isso acontece, meus trabalhadores do Celery não serão reiniciados porque, quando o servidor for reinicializado, ele alterará a propriedade dos arquivos de log do celery do meu usuário "aipo" para "root". Além disso, o sistema exclui meu diretório /run/celery onde escrevo meus arquivos pid. Se eu fizer essas alterações manualmente e reiniciar o Celery, todos os meus trabalhadores iniciarão normalmente.
Como essas mudanças precisam ocorrer antes de iniciar os trabalhadores, pensei que a solução seria escrever um script de shell que, devido à sua prioridade mais alta, fosse executado a partir do meu script supervisor.conf antes dos comandos do trabalhador do aipo (veja abaixo).
No entanto, este script de configuração não será executado. Meu registro de supervisor apenas diz:
exited: celery-setup (exit status 0; not expected)
gave up: celery-setup entered FATAL state, too many start retries too quickly.
Além disso, nenhum erro é gravado nos arquivos de log stdout/err.
Minhas perguntas são:
Esta é a abordagem correta para alterar minhas permissões de log de trabalho e recriar os diretórios pid antes que os trabalhadores do aipo sejam reiniciados?
Se esta é a abordagem correta, por que não está funcionando? Se não for, qual é a abordagem correta?
Se eu estivesse usando um script init.d celeryd daemon em vez do Supervisor, há umCELERY_CREATE_DIRSconfiguração que criará automaticamente diretórios pid e log que pertencem ao usuário/grupo. Existe uma maneira de replicar essa configuração ao usar o supervisord?
Por um lado, sei que o Supervisor só deve ser usado em processos em primeiro plano, o que não é o caso deste script. Por outro lado, vi outras perguntas aqui que parecem implicar que você deve ser capaz de executar um script de shell no Supervisor.
Obrigado pela ajuda.
# celery-supervisor-setup
#!/bin/bash
for i in 1 2 3
do
if [ -f "/var/log/celery/worker${i}.log" ]; then
echo "processing $i"
chown celery:celery /var/log/celery/worker${i}.log
fi
done
if [ ! -d "/run/celery" ]; then
mkdir /run/celery
chown celery:celery /run/celery
fi
# /etc/supervisor/conf.d/supervisor.conf
[program:celery-setup]
command = /www/myproj/conf/celery-supervisor-setup
; This next command didn't work
;command = bash -c " /www/myproj/conf/celery-supervisor-setup"
user = root
stdout_logfile = /var/log/celery_setup_stdout.log
stderr_logfile = /var/log/celery_setup_stderr.log
redirect_stderr = true
autostart = true
autorestart = false
priority=997
[program:celeryw1]
command=/home/myproj/venv/myproj/bin/celery worker --app=conf.celeryapp:app -n worker1 --config=celeryconfig -Q default --loglevel=info --pidfile=/var/run/celery/worker1.pid
directory=/www/myproj
user=celery
numprocs=1
stdout_logfile=/var/log/celery/worker1.log
stderr_logfile=/var/log/celery/worker1.log
redirect_stderr=true
autostart=true
autorestart=true
startsecs=1
stopwaitsecs=600
killasgroup=true
priority=998
; Note that I have "celeryw2" and "celeryw3" subprocess groups that are similar
; to the above except they refer to workers 2 and 3. I omitted them to save space.
[group:celery-workers]
programs=celeryw1,celeryw2,celeryw3
priority=999