У меня есть приложение Django 1.6.2, которое использует Celery 3.1.7 для асинхронных задач. Я запускаю своих работников Celery с помощью Supervisor. Пока все работает хорошо, за исключением перезагрузки сервера Debian 7.8. Когда это происходит, мои работники Celery не перезапускаются, потому что при перезагрузке сервера он меняет владельца файлов журнала celery с моего пользователя "celery" на "root". Кроме того, система удаляет мой каталог /run/celery, в котором я записываю свои pid-файлы. Если я вношу эти изменения вручную и перезапускаю Celery, все мои работники запускаются нормально.
Поскольку эти изменения необходимо внести до запуска рабочих процессов, я подумал, что решением будет написать скрипт оболочки, который, ввиду его более высокого приоритета, будет выполняться из моего скрипта supervisor.conf до команд рабочего процесса celery (см. ниже).
Однако этот скрипт настройки не запустится. В моем журнале супервизора просто написано:
exited: celery-setup (exit status 0; not expected)
gave up: celery-setup entered FATAL state, too many start retries too quickly.
Кроме того, в файлы журнала stdout/err не записываются никакие ошибки.
У меня есть вопросы:
Правильный ли это подход для изменения разрешений журнала рабочих процессов и повторного создания каталогов pid перед перезапуском рабочих процессов Celery?
Если это правильный подход, почему он не работает? Если нет, то какой подход правильный?
Если бы я использовал скрипт демона init.d celeryd вместо Supervisor, то естьCELERY_CREATE_DIRSнастройка, которая автоматически создаст pid и каталоги журнала, принадлежащие пользователю/группе. Есть ли способ повторить эту настройку при использовании 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