2012-04-20 2 views
15

Мне очень нравится использовать выскочку. В настоящее время у меня есть upstart jobs, чтобы запускать различные экземпляры gunicorn в нескольких виртуальных версиях. Тем не менее, 2-3 примера, которые я нашел для сценариев выскочки Celery на межстранах, не работают для меня.Как написать работу Ubuntu Upstart для сельдерея (django-celery) в virtualenv

Итак, со следующими переменными, как мне написать задачу Upstart для запуска django-сельдерея в virtualenv.

Путь к Django проекта:

/srv/projects/django_project 

Путь к virtualenv этого проекта:

/srv/environments/django_project 

Путь к настройкам сельдерея является настройки проекта файл Django (Джанго-сельдерей):

/srv/projects/django_project/settings.py 

Путь к файлу журнала для данного экземпляра Celery:

/srv/logs/celery.log 

Для этого виртуального окр пользователь:

iamtheuser 

и группа:

www-data 

Я хочу, чтобы запустить сельдерей Демона с celerybeat, поэтому команду я хочу передать на django-admin.py (или manage.py):

python manage.py celeryd -B 

Это будет e лучше, если сценарий начнется после начала операции по пулу, и остановится, когда прекратится работа по стрельбе. Допустим, файл для этого есть:

/etc/init/gunicorn.conf 

ответ

17

Вы, возможно, потребуется добавить еще несколько настроек, но это выскочка скрипт я написал для запуска Джанго-сельдерей в качестве конкретного пользователя в virtualenv:

start on started mysql 
stop on stopping mysql 

exec su -s /bin/sh -c 'exec "$0" "[email protected]"' user -- /home/user/project/venv/bin/python /home/user/project/django_project/manage.py celeryd 

respawn 

Это отлично работает для меня.

Я знаю, что он выглядит уродливым, но он, по-видимому, является нынешней «правильной» техникой для запуска upstart-заданий как непривилегированных пользователей на основе this superuser answer.

Я думал, что мне пришлось бы сделать больше, чтобы заставить его работать внутри виртуального, но вызов двоичного кода python внутри virtualenv - это все, что требуется.

+0

Отлично, я изменил это, и он работает aok. – pwalsh

+0

может быть приятно добавить вашу настройку ... Я разместил мой здесь: http://stackoverflow.com/questions/14275821/how-to-run-celery-as-a-deamon-in-production/16470913#16470913 –

0

Вот моя рабочая конфигурация с использованием более новой системы, работающей на Ubuntu 16.04 LTS. Сельдерей в виртуальном. Приложение представляет собой Python/Flask.

Systemd файл: /etc/systemd/system/celery.service

Вы хотите изменить пользователя и пути.

[Unit] 
Description=Celery Service 
After=network.target 

[Service] 
Type=forking 
User=nick 
Group=nick 
EnvironmentFile=-/home/nick/myapp/server_configs/celery_env.conf 
WorkingDirectory=/home/nick/myapp 
ExecStart=/bin/sh -c '${CELERY_BIN} multi start ${CELERYD_NODES} \ 
    -A ${CELERY_APP} --pidfile=${CELERYD_PID_FILE} \ 
    --logfile=${CELERYD_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL} ${CELERYD_OPTS}' 
ExecStop=/bin/sh -c '${CELERY_BIN} multi stopwait ${CELERYD_NODES} \ 
    --pidfile=${CELERYD_PID_FILE}' 
ExecReload=/bin/sh -c '${CELERY_BIN} multi restart ${CELERYD_NODES} \ 
    -A ${CELERY_APP} --pidfile=${CELERYD_PID_FILE} \ 
    --logfile=${CELERYD_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL} ${CELERYD_OPTS}' 

[Install] 
WantedBy=multi-user.target 

файл по окружающей среде (ссылка выше): /home/nick/myapp/server_configs/celery_env.conf

# Name of nodes to start 
# here we have a single node 
CELERYD_NODES="w1" 
# or we could have three nodes: 
#CELERYD_NODES="w1 w2 w3" 

# Absolute or relative path to the 'celery' command: 
CELERY_BIN="/home/nick/myapp/venv/bin/celery" 

# App instance to use 
CELERY_APP="myapp.tasks" 

# How to call manage.py 
CELERYD_MULTI="multi" 

# Extra command-line arguments to the worker 
CELERYD_OPTS="--time-limit=300 --concurrency=8" 

# - %n will be replaced with the first part of the nodename. 
# - %I will be replaced with the current child process index 
# and is important when using the prefork pool to avoid race conditions. 
CELERYD_PID_FILE="/var/run/celery/%n.pid" 
CELERYD_LOG_FILE="/var/log/celery/%n%I.log" 
CELERYD_LOG_LEVEL="INFO" 

Для автоматического создания журнала и папки запуска с правильными разрешениями для вашего пользователя, создать файл в /usr/lib/tmpfiles.d. У меня возникли проблемы с удалением папки /var/run/celery при перезагрузке, а затем сельдерей не смог начать правильно.

Мой /usr/lib/tmpfiles.d/celery.conf файл:

d /var/log/celery 2775 nick nick - 
d /var/run/celery 2775 nick nick - 

Чтобы включить: sudo systemctl enable celery.service

Теперь вам необходимо перезагрузить систему в /var/log/celery и /var/run/celery папки, которые будут созданы. Вы можете проверить, начался ли сельдерей после перезагрузки, проверив журналы в /var/log/celery.

Чтобы возобновить сельдерей: sudo systemctl restart celery.service Отладка: tail -f /var/log/syslog и попробуйте перезапустить сельдерей, чтобы узнать, что это за ошибка. Это может быть связано с бэкэндом или другими вещами.

Надеюсь, это поможет!

 Смежные вопросы

  • Нет связанных вопросов^_^