如何在virtualenv中为Celery(django-celery)编写Ubuntu Upstart工作

时间:2012-04-20 17:20:13

标签: django ubuntu celery django-celery upstart

我真的很喜欢使用暴发户。我目前有很多新手工作,可以在许多版本中运行不同的gunicorn实例。但是,我在互联网上找到的芹菜新贵脚本的2-3个例子对我不起作用。

因此,使用以下变量,我将如何编写Upstart作业以在virtualenv中运行django-celery。

Django项目之路:

/srv/projects/django_project

这个项目的路径:virtualenv:

/srv/environments/django_project

芹菜设置的路径是Django项目设置文件(django-celery):

/srv/projects/django_project/settings.py

此Celery实例的日志文件的路径:

/srv/logs/celery.log

对于此虚拟环境,用户:

iamtheuser

和小组:

www-data

我想用celerybeat运行Celery守护程序,因此,我要传递给django-admin.py(或manage.py)的命令是:

python manage.py celeryd -B

如果脚本在gunicorn作业开始后启动,那将会更好,并且当gunicorn作业停止时停止。假设该文件是:

/etc/init/gunicorn.conf

2 个答案:

答案 0 :(得分:16)

您可能需要添加更多配置,但这是我为了在virtualenv中作为特定用户启动django-celery而编写的一个新贵脚本:

start on started mysql
stop on stopping mysql

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

respawn

它对我很有用。

我知道它看起来很难看,但它似乎是基于this superuser answer以非特权用户身份运行新手工作的当前“正确”技术。

我认为我必须做更多工作才能让它在virtualenv中工作,但是在virtualenv中调用python二进制文件就是它所需要的。

答案 1 :(得分:1)

这是我使用在Ubuntu 16.04 LTS上运行的较新systemd的工作配置。芹菜是一个虚拟的人。应用程序是Python / Flask。

系统档案:/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并尝试重启celery以查看错误。它可能与后端或其他事情有关。

希望这有帮助!