我正在使用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实例,使代码更加独立于平台并且不受不可避免的操作系统更新的影响?
答案 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