如何在生产中将芹菜作为守护进程运行?

时间:2013-01-11 10:09:37

标签: python django celery

我从/ etc / defaults /在这里的代码中创建了一个celeryd文件:

https://github.com/celery/celery/blob/3.0/extra/generic-init.d/celeryd

现在,当我想将celeryd作为守护进程运行并执行此操作时:sudo /etc/init.d/celerdy它表示命令未找到。我哪里错了?

5 个答案:

答案 0 :(得分:19)

我不确定你在这里做什么,但这些是将celery作为守护进程运行的步骤。

  1. 您在链接中引用的文件 https://github.com/celery/celery/blob/3.0/extra/generic-init.d/celeryd 需要使用名称复制到/etc/init.d文件夹中 celeryd
  2. 然后,您需要在该文件夹中创建配置文件 上面使用的名称为/etc/default的{​​{1}} 脚本。此配置文件基本上定义了某些变量 和上述脚本使用的路径。这是an example configuration.
  3. 此链接Generic init scripts说明了该过程,可供参考

答案 1 :(得分:9)

我发现此链接非常有用:How to write an Ubuntu Upstart job for Celery (django-celery) in a virtualenv

调整一下..我有一个使用这个脚本运行的芹菜工人:

(使用ubuntu upstart)

命名为iamcelery.conf 并将其放在/ etc / init中(注意:不是init.d)

# iamcelery -runs the celery worker as my virtual env user
#
#
# This task is run on startup to start the celery worker as my vritual env user

description "runs the celery worker"
author "michel van Leeuwen <michel@iamit.nl>"

start on runlevel [2345]
stop on runlevel [!2345]

# retry if ended unexpectedly
respawn
# limit the retries to max 15 times with timeouts of 5 seconds
respawn limit 15 5

# Time to wait between sending TERM and KILL signals
kill timeout 20

task
script
  exec su -s /bin/sh -c 'exec "$0" "$@"' <place here your unprovilegd username> -- srv/<here the path of your django project>/bin/django celeryd -BE -l info
end script

现在您可以启动此scipt(它也在服务器启动时启动):

sudo start iamcelery

或停止:

sudo stop iamcelery

或检查其状态:

sudo status iamcelery

我并不确定这是最好的方式....但是......经过长时间的试验和错误试图让initd脚本工作....(没有成功)......这终于有效了。

编辑2013年6月8日 我在这里给出的脚本似乎最终作为根源运行。 现在我改变了这个:

script
  su <place here your unprovilegd username>
  cd /srv/<here the path of your django project>/
  exec bin/django celeryd -BE -l info
end script

成:

script
  exec su -s /bin/sh -c 'exec "$0" "$@"' <place here your unprovilegd username> -- srv/<here the path of your django project>/bin/django celeryd -BE -l info
end script

这是有效的,所有学分都是这个问题的答案: How to write an Ubuntu Upstart job for Celery (django-celery) in a virtualenv

编辑2013年9月5日

还有一件小事:我必须在控制台中的start命令之后执行ctrl-c(并在此之后执行状态检查):如果有人知道这一点:请保留命令,我可以更新这个答案......

答案 2 :(得分:8)

我通常使用supervisor(加django-supervisor)来实现此目的。这样,您就不需要弄清楚如何守护应用程序中的每个进程(至少您拥有一个Web服务器)托管django,再加上芹菜,加上你用来支持这两者的其他中间件。)Supervisor知道如何将自己作为一个守护进程运行,所有其他进程都作为主管的子进行运行。

答案 3 :(得分:3)

正如Marcin在他的回答中所解释的那样,主管通常是人们最终使用的东西,但是如果你正在寻找可以与python3一起使用的东西而且不能等待主管的第4版我认为有了python3的支持,那么你可以使用circus。安装之后,您只需要一个circus.ini文件,该文件将包含您要守护的所有进程,然后运行该示例circus.ini可能如下所示:

[watcher:celery]
cmd = full_path/python3.4 full_path/manage.py celeryd -B -l info

[watcher:celerycamera]
cmd = full_path/python3.4 full_path/manage.py celery events --camera=djcelery.snapshot.Camera

[watcher:dceleryflower]
cmd = full_path/python3.4 full_path/manage.py celery flower -A your_app_name --basic_auth=username:password --port=5555 

如果您想要更多详细信息,我会发布与相同here相关的帖子。希望能节省一些时间。感谢

答案 4 :(得分:0)

注意:在ubuntu 16.04中,我的anser与.conf文件不再有效。

我创建了一个.service文件并将其放在/ etc / systemd / system /

我可以使用

sudo service myservice status

sudo service myservice start

sudo service myservice stop

作为命令

e.g。这个档案:

myservice.service:

[Unit] 
Description=My celery worker 

[Service]
WorkingDirectory=/srv/my-project-path
User=buildout
Group=buildout
Restart=on-failure
RestartSec=20 5
ExecStart=/srv/my-project/bin/django celeryd -BE

[Install]
WantedBy=multi-user.target
Alias=myservice.service

注意我使用buildout,所以在bin / django的setad中,大多数用户需要使用python的路径并使用mange.py。

基于:http://minecraft.gamepedia.com/Tutorials/Ubuntu_startup_script(参见with systemd部分)