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