2012-04-20 10 views
15

Realmente disfruto usando advenedizo. Actualmente tengo trabajos upstart para ejecutar diferentes instancias de gunicornio en una serie de virtualenvs. Sin embargo, los 2-3 ejemplos que encontré para las secuencias de comandos de upstart de Celery en los interwebs no funcionan para mí.Cómo escribir un trabajo Upstart de Ubuntu para apio (django-apio) en un virtualenv

Entonces, con las siguientes variables, ¿cómo escribiría un trabajo Upstart para ejecutar django-apio en un virtualenv.

Ruta al proyecto Django:

/srv/projects/django_project 

Camino a virtualenv de este proyecto:

/srv/environments/django_project 

camino hacia la configuración de apio es el archivo de Django configuración del proyecto (django-apio):

/srv/projects/django_project/settings.py 

Ruta al archivo de registro para esta instancia de Apio:

/srv/logs/celery.log 

Por esta env virtual, el usuario:

iamtheuser 

y el grupo:

www-data 

Quiero correr el apio Daemon con celerybeat, así, el comando quiero transmitir a la django-admin.py (o manage.py) es:

python manage.py celeryd -B 

será correo Será mejor si el guión comienza después de que comience el trabajo de gunicornio, y se detiene cuando se detiene el trabajo de gunicornio. Digamos que el archivo para esto es:

/etc/init/gunicorn.conf 

Respuesta

17

Es posible que necesite añadir un poco más de configuración, pero esto es una secuencia de comandos advenedizo que escribí para el inicio de django-apio como un usuario particular en un 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 

Funciona muy bien para mí.

Sé que se ve feo, pero parece ser la técnica actual "adecuada" para ejecutar trabajos upstart como usuarios no privilegiados, basado en this superuser answer.

Pensé que tendría que haber hecho más para que funcionase dentro del virtualenv, pero basta con llamar al binario de python dentro del virtualenv.

+0

Genial, he ajustado esto y está funcionando bien. – pwalsh

+0

podría ser bueno agregar tu modificación ... Publiqué la mía aquí: http://stackoverflow.com/questions/14275821/how-to-run-celery-as-a-deamon-in-production/16470913#16470913 –

0

Aquí está mi configuración de trabajo utilizando el sistema más nuevo ejecutado en Ubuntu 16.04 LTS. El apio está en virtualenv. La aplicación es un Python/Flask.

archivo Systemd: /etc/systemd/system/celery.service

Usted querrá cambiar el usuario y caminos.

[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 

archivo de Medio Ambiente (mencionado anteriormente): /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" 

para crear automáticamente el registro y la carpeta carrera con los permisos correctos para el usuario, crear un archivo en /usr/lib/tmpfiles.d. Estaba teniendo problemas con la eliminación de la carpeta /var/run/celery al reiniciar y, luego, el apio no se pudo iniciar correctamente.

Mi /usr/lib/tmpfiles.d/celery.conf archivo:

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

Para habilitar: sudo systemctl enable celery.service

Ahora se tendrá que reiniciar el sistema para que se creen las /var/log/celery y /var/run/celery carpetas. Puede verificar si el apio comenzó después del reinicio al verificar los registros en /var/log/celery.

Para reiniciar el apio: sudo systemctl restart celery.service Depuración: tail -f /var/log/syslog e intente reiniciar el apio para ver cuál es el error. Podría estar relacionado con el backend u otras cosas.

Espero que esto ayude!

Cuestiones relacionadas