У меня есть приложение 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 не записываются ошибки.
Мои вопросы:
Правильный ли это подход, чтобы изменить разрешения моего рабочего журнала и воссоздать каталоги pid до перезапуска рабочих сельдерея?
Если это правильный подход, почему он не работает? Если нет, то каков правильный подход?
Если бы я использовал сценарий демона 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