我从这里的代码中创建了一个位于/etc/defaults/目录下的celeryd文件:
https://github.com/celery/celery/blob/3.0/extra/generic-init.d/celeryd
现在当我想要将celeryd作为守护进程运行并执行以下命令:sudo /etc/init.d/celerdy 时,它会显示"command not found"。请问我哪里做错了?
我从这里的代码中创建了一个位于/etc/defaults/目录下的celeryd文件:
https://github.com/celery/celery/blob/3.0/extra/generic-init.d/celeryd
现在当我想要将celeryd作为守护进程运行并执行以下命令:sudo /etc/init.d/celerdy 时,它会显示"command not found"。请问我哪里做错了?
我不确定你在这里做什么,但下面是作为守护进程运行celery的步骤。
/etc/init.d
文件夹,并重命名为celeryd
/etc/default
中创建一个名为celeryd
的配置文件,该文件由上述脚本使用。此配置文件基本上定义了一些变量和路径,这些变量和路径由上述脚本使用。以下是示例配置。# 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
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
into:
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
这个方法非常有效,所有的功劳归功于这个问题的答案:如何为Celery(django-celery)在虚拟环境中编写Ubuntu Upstart作业
2013年9月5日编辑
还有一件小事:在控制台中启动命令后,我必须按ctrl-c键(并在此之后进行状态检查):如果有人知道,请将其留在命令中,我可以更新这个答案...
我通常使用supervisor(加上django-supervisor)来实现这个目的。这样,您就不需要弄清楚如何将应用程序中的每个进程守护化(至少包括托管django的Web服务器,加上celery,以及您实际使用的任何其他中间件来支持这两者)。Supervisor知道如何作为守护进程运行自身,并且您的所有其他进程都作为supervisor的子进程运行。
如Marcin在他的回答中所解释的那样,supervisor通常是人们最终使用的工具,但如果你正在寻找可以与python3配合使用且不能等待supervisor的版本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
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