添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

从Django应用程序中自动启动Celery

1 人关注

我正在谷歌计算引擎的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

The directory:

/home/user/gce_app

是我的Django项目所在的地方,也是我启动Celery所需的目录。然而,在重启实例后,当我输入。

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

Opening the errors.log file, I see:

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

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

linux
django
debian
celery
google-compute-engine
user714852
user714852
发布于 2014-04-23
2 个回答
E. Anderson
E. Anderson
发布于 2014-04-23
已采纳
0 人赞同

我认为你在'cd'和celery的调用之间缺少一个分号。 另外,我怀疑rc.local可能没有搜索你的路径,所以你可能需要给celery一个绝对路径。

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

另外,你可以考虑使用一个 来自GCE元数据的启动脚本 以免需要修改rc.local。

谢谢你的评论--我会尝试包括分号。这里的关键是找到一种方法,让celery由django应用程序启动。我不希望被锁定在GCE或其他回声系统中,所以如果有办法将启动请求与django应用本身联系起来,那就太棒了。
yorodm
yorodm
发布于 2014-04-23
0 人赞同

由于你似乎在使用upstart,这可能对你有帮助。

description "runs celery"
start on runlevel [2345]
stop on runlevel [!2345]
console log
env VENV='/srv/myvirtualenv'
env PROJECT='/srv/run/mydjangoproject'