Назад | Перейти на главную страницу

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

У меня есть приложение Django 1.6.2, которое использует Celery 3.1.7 для асинхронных задач. Я запускаю свои рабочие сельдерея с помощью Supervisor. Пока все работает хорошо, за исключением момента, когда я перезагружаю свой сервер Debian 7.8. Когда это произойдет, мои рабочие 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, принадлежащие пользователю / группе. Есть ли способ воспроизвести этот параметр при использовании супервизора?

С одной стороны, я знаю, что 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