Executar script de shell como subprocesso Supervisord?

Executar script de shell como subprocesso Supervisord?

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:

  1. 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?

  2. Se esta é a abordagem correta, por que não está funcionando? Se não for, qual é a abordagem correta?

  3. 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

informação relacionada