Skip to main content
 首页 » 编程设计

python之Celery Daemon 在 Centos 7 上不工作

2025年05月04日13qq78292959

我正在尝试在具有 systemd/systemctl 的 Centos 7 上运行 celery 守护进程。 它不起作用。

  • 我尝试了一个非守护程序的案例,它成功了
  • 我运行了 ~mytask,它在客户端机器和运行 celery 守护进程的服务器上卡住了,我完全没有记录任何内容。
  • 我注意到实际上没有 celery 进程在运行。

关于如何解决这个问题有什么建议吗?

这是我的守护进程默认配置:

CELERYD_NODES="localhost.localdomain" 
CELERY_BIN="/tmp/myapp/venv/bin/celery" 
CELERY_APP="pipeline" 
CELERYD_OPTS="--broker=amqp://192.168.168.111/" 
CELERYD_LOG_LEVEL="INFO" 
CELERYD_CHDIR="/tmp/myapp" 
CELERYD_USER="root" 

注意:我正在启动守护进程

sudo /etc/init.d/celeryd start 

我的 celery 守护进程脚本来自: https://raw.githubusercontent.com/celery/celery/3.1/extra/generic-init.d/celeryd

我也试过来自: https://raw.githubusercontent.com/celery/celery/3.1/extra/generic-init.d/celeryd 但是这个在尝试启动守护进程时向我展示了一个错误:

systemd[1]: Starting LSB: celery task worker daemon... 
celeryd[19924]: basename: missing operand 
celeryd[19924]: Try 'basename --help' for more information. 
celeryd[19924]: Starting : /etc/rc.d/init.d/celeryd: line 193: multi: command not found 
celeryd[19924]: [FAILED] 
systemd[1]: celeryd.service: control process exited, code=exited status=1 
systemd[1]: Failed to start LSB: celery task worker daemon. 
systemd[1]: Unit celeryd.service entered failed state. 

请您参考如下方法:

正如@ChillarAnand 之前回答过的,不要使用 celeryd .

但其实并没有他写的用celery multi运行celery那么简单使用 systemd。

这是我工作的、不明显的(我认为)示例。

它们已经在 Centos 7.1.1503 上与 celery 3.1.23 (Cipater) 在 virtualenv 中运行进行了测试,以及来自 Celery tutorial 的 tasks.py 示例应用程序.

运行单个 worker

[Unit] 
Description=Celery Service 
After=network.target 
 
[Service] 
Type=forking 
User=vagrant 
Group=vagrant 
 
# directory with tasks.py 
WorkingDirectory=/home/vagrant/celery_example 
 
# !!! using the below systemd is REQUIRED in this case! 
# (you will still get a warning "PID file /var/run/celery/single.pid not readable (yet?) after start." from systemd but service will in fact be starting, stopping and restarting properly. I haven't found a way to get rid of this warning.) 
PIDFile=/var/run/celery/single.pid 
 
# !!! using --pidfile option here and below is REQUIRED in this case! 
# !!! also: don't use "%n" in pidfile or logfile paths - you will get these files named after the systemd service instead of after the worker (?) 
ExecStart=/home/vagrant/celery_example/venv/bin/celery multi start single-worker -A tasks --pidfile=/var/run/celery/single.pid --logfile=/var/log/celery/single.log "-c 4 -Q celery -l INFO" 
 
ExecStop=/home/vagrant/celery_example/venv/bin/celery multi stopwait single-worker --pidfile=/var/run/celery/single.pid --logfile=/var/log/celery/single.log 
 
ExecReload=/home/vagrant/celery_example/venv/bin/celery multi restart single-worker --pidfile=/var/run/celery/single.pid --logfile=/var/log/celery/single.log 
 
# Creates /var/run/celery, if it doesn't exist 
RuntimeDirectory=celery 
 
[Install] 
WantedBy=multi-user.target 

运行多个 worker

[Unit] 
Description=Celery Service 
After=network.target 
 
[Service] 
Type=forking 
User=vagrant 
Group=vagrant 
 
# directory with tasks.py 
WorkingDirectory=/home/vagrant/celery_example 
 
# !!! in this case DON'T set PIDFile or use --pidfile or --logfile below or it won't work! 
ExecStart=/home/vagrant/celery_example/venv/bin/celery multi start 3 -A tasks "-c 4 -Q celery -l INFO" 
 
ExecStop=/home/vagrant/celery_example/venv/bin/celery multi stopwait 3 
 
ExecReload=/home/vagrant/celery_example/venv/bin/celery multi restart 3 
 
# Creates /var/run/celery, if it doesn't exist 
RuntimeDirectory=celery 
 
[Install] 
WantedBy=multi-user.target 

(请注意,我正在使用 -c / --concurrency > 1 运行 worker,但它也可以将其设置为 1 或默认值。如果您不使用 virtualenv,这也应该有效,但我强烈建议您使用它.)

我真的不明白为什么 systemd 在第一种情况下无法猜测 fork 进程的 PID,以及为什么将 pidfile 放在特定位置会破坏第二种情况,所以我在这里提交了一张票:https://github.com/celery/celery/issues/3459 .如果我会得到答案或自己提出一些解释,那么我会把它们张贴在这里。