¿Ejecutar script de shell como subproceso supervisor?

¿Ejecutar script de shell como subproceso supervisor?

Tengo una aplicación Django 1.6.2 que usa Celery 3.1.7 para tareas asincrónicas. Estoy iniciando a mis trabajadores de Apio usando Supervisor. Hasta ahora todo funciona bien excepto cuando reinicio mi servidor Debian 7.8. Cuando eso sucede, mis trabajadores de Celery no se reinician porque cuando el servidor se reinicia, cambia la propiedad de los archivos de registro de apio de mi usuario "apio" a "root". Además, el sistema elimina mi directorio /run/celery donde escribo mis archivos pid. Si hago estos cambios a mano y reinicio Celery, todos mis trabajadores comienzan normalmente.

Dado que estos cambios deben ocurrir antes de iniciar los trabajadores, pensé que la solución sería escribir un script de shell que, debido a su mayor prioridad, se ejecuta desde mi script supervisor.conf antes de los comandos del trabajador de apio (ver más abajo).

Sin embargo, este script de configuración no se ejecutará. Mi registro de supervisor solo dice:

exited: celery-setup (exit status 0; not expected)
gave up: celery-setup entered FATAL state, too many start retries too quickly.

Además, no se escriben errores en los archivos de registro stdout/err.

Mis preguntas son:

  1. ¿Es este el enfoque correcto para cambiar los permisos de registro de mis trabajadores y recrear los directorios pid antes de que se reinicien los trabajadores del apio?

  2. Si este es el enfoque correcto, ¿por qué no funciona? Si no es así, ¿cuál es el enfoque correcto?

  3. Si estuviera usando un script de demonio init.d celeryd en lugar de Supervisor, hay unAPIO_CREATE_DIRSconfiguración que creará automáticamente directorios pid y de registro que son propiedad del usuario/grupo. ¿Hay alguna manera de replicar esta configuración cuando se usa supervisord?

Por un lado, sé que Supervisor solo debe usarse en procesos en primer plano, lo cual no es el caso con este script. Por otro lado, he visto otras preguntas aquí que parecen implicar que debería poder ejecutar un script de shell desde Supervisor.

Gracias por tu ayuda.

# 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

información relacionada