从Django app中自动启动Celery

时间:2014-04-23 14:39:50

标签: linux django debian celery google-compute-engine

我正在使用Google Compute Engine上的Linux(Debian Whiskey)服务器启动Django 1.6设置。我已经在后台运行Celery 3.1以帮助完成某些过程。当我启动一个新实例(使用我创建的快照)时,我总是需要启动Celery。我正在寻找一种在服务器负载上自动启动Celery的方法。如果服务器决定重新启动,这尤其有用,因为它们似乎偶尔会这样做。为此,我编辑了rc.local文件:

$ sudo nano /etc/rc.local

过去包含以下内容:

exit 0
[ -x /sbin/initctl ] && initctl emit --no-wait google-rc-local-has-run || true

我已经对文件进行了编辑,现在它显示为:

cd /home/user/gce_app celery -A myapp.tasks --concurrency=1 --loglevel=info worker > output.log 2> errors.log &
exit 0
[ -x /sbin/initctl ] && initctl emit --no-wait google-rc-local-has-run || true

目录:

/home/user/gce_app

是我的Django项目所在的位置以及启动Celery所需的目录。但是,重新启动实例后,当我输入:

$ celery status
Error: No nodes replied within time constraint.

打开errors.log文件,我看到了:

/etc/rc.local: 14: /etc/rc.local: celery: not found

该代码字符串开头的cd当然应该解决这个问题吗?是否有一种方法(在Django项目本身内)在项目启动时启动Celery实例,使代码更加独立于平台并且不受不可避免的操作系统更新的影响?

2 个答案:

答案 0 :(得分:1)

我认为你的'cd'和芹菜调用之间缺少一个分号。此外,我怀疑rc.local可能不会搜索你的路径,所以你可能需要给芹菜绝对路径。 e.g。

cd /home/user/gce_app; /usr/bin/celery ...

或者,您可以考虑使用startup script from the GCE metadata来避免需要修改rc.local。

答案 1 :(得分:0)

由于您似乎正在使用新贵,这可能会对您有所帮助:

description "runs celery"
start on runlevel [2345]
stop on runlevel [!2345]

console log
env VENV='/srv/myvirtualenv'
env PROJECT='/srv/run/mydjangoproject'

exec su -s /bin/sh -c 'exec "$0" "$@"' www-data -- /usr/bin/env PATH=$VENV:$PATH     $VENV/python $PROJECT/manage.py celeryd

respawn
respawn limit 10 5