Запустить сценарий оболочки как подпроцесс Supervisord?

У меня есть приложение Django 1.6.2, которое использует Celery 3.1.7 для асинхронных задач. Я начинаю своих работников из сельдерея с помощью Supervisor. Пока что все работает хорошо, за исключением случаев, когда я перезагружаю свой сервер Debian 7.8. Когда это происходит, мои работники Celery не перезагружаются, потому что, когда сервер перезагружается, он меняет владельца файлов журналов celery с моего пользователя "celery" на "root". Также система удаляет мой каталог /run/celery, в который я записываю свои pid-файлы. Если я внесу эти изменения вручную и перезапущу Celery, все мои работники начнут работать нормально.

Поскольку эти изменения должны произойти до запуска рабочих, я подумал, что решением будет написать сценарий оболочки, который, в силу своего более высокого приоритета, будет выполняться из моего сценария supervisor.conf перед командами работника сельдерея (см. Ниже).

Однако этот сценарий установки не будет запущен. Мой журнал супервизора просто говорит,

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

Кроме того, ошибки не записываются в файлы журнала stdout/err.

Мои вопросы:

  1. Является ли это правильным подходом, чтобы изменить мои разрешения в журнале работника и воссоздать каталоги pid до перезапуска работников сельдерея?

  2. Если это правильный подход, почему он не работает? Если это не так, каков правильный подход?

  3. Если бы я использовал сценарий демона init.d celeryd вместо Supervisor, есть параметр CELERY_CREATE_DIRS, который будет автоматически создавать каталоги pid и log, которые принадлежат пользователю / группе. Есть ли способ воспроизвести этот параметр при использовании supervisord?

С одной стороны, я знаю, что Supervisor должен использоваться только на переднем плане, что не относится к этому сценарию. С другой стороны, я видел здесь другие вопросы, которые, по-видимому, подразумевают, что вы должны иметь возможность запускать сценарий оболочки из Supervisor.

Спасибо за вашу помощь.

# 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

0 ответов

Другие вопросы по тегам