在我的Django项目中,我使用Celery和Rabbitmq在后台运行任务。
我正在使用芹菜节拍调度程序来运行定期任务。
如何以编程方式检查芹菜节拍是否已启动并正在运行?

  • 你为什么要这么做?您要在发送任务之前检查吗?
  • 原因之一是如果celerybeat未运行,则启动故障转移。似乎没有一种可接受的方式来实现这一目标。
  • 如果是这样,那么最好使用supervisord之类的东西。
  • 这是一个真正的问题。最近,我们的一个模块发生了故障,该模块依靠芹菜拍打来运行重要的面包屑。原来是上星期五,几台服务器出现了暂时的网络中断,其中一台托管了我们的Rabbitmq安装。一小时内将其恢复。但是由于无法重新连接,芹菜拍打导致整个系统几乎一直持续到星期一早上。甚至我也在寻找一种可靠的方式来对其进行监视。找到了这个,但是最新版本github.com/KristianOellegaard/…不支持python 2.7。

使任务定期发送HTTP请求到Ping URL。如果未按时ping通URL,URL监视器将向您发送警报。

1
2
3
4
5
6
7
8
import requests
from yourapp.celery_config import app

@app.task
def ping():
    print '[healthcheck] pinging alive status...'
    # healthchecks.io works for me:
    requests.post("https://hchk.io/6466681c-7708-4423-adf0-XXXXXXXXX")

此celery定期任务计划每分钟运行一次,如果未完成ping操作,则您的节拍服务已关闭*,监视器将启动您的邮件(或网络挂机,因此您可以通过zapier来获取移动推送通知)以及)。

1
celery -A yourapp.celery_config beat -S djcelery.schedulers.DatabaseScheduler

*或不知所措,您应该跟踪任务的完成情况,这是Celery的噩梦,应该被检测并正确解决,当工作人员忙于阻塞需要优化的任务时经常发生

  • 这是错误的,因为当时工人可能会倒下。
  • 如果您说" hchk.io"可能会关闭,那么确实是这样,然后例如依赖于类似于aws的lambda函数。如果您的意思是芹菜"工人"没错,因为如果工人死亡,ping服务将等待他说"我还活着",否则"它已经死了",这就是这种服务的重点。

我最近针对相同的问题使用了类似于@panchicore建议的解决方案。

我的工作场所中的问题是处理芹菜节拍的重要系统,有时是由于RabbitMQ中断或我们的服务器与RabbitMQ服务器之间的某些连接问题,由于芹菜节拍不再停止触发克朗,除非重新启动。

由于我们没有任何方便的工具,因此,为了监视通过HTTP发送的keep alive调用,我们出于相同的目的使用了statsd。每分钟statsd服务器上会增加一个计数器(由celery任务完成),然后我们设置电子邮件


如果您已按照celery文档的教程将celery守护化,则可以通过

来检查其是否正在运行。

1
2
sudo /etc/init.d/celeryd status
sudo /etc/init.d/celerybeat status

您可以在python模块中使用此类命令的返回。


n

您可能可以查找主管。
它提供了一个celerybeat conf,可将与节拍相关的所有信息记录在/var/log/celery/beat.log中。

解决此问题的另一种方法是使用Flower。您可以为服务器设置它(确保其密码受保护),在GUI中注意到正在排队的任务以及何时排队的任务会更容易一些,从而验证您的节拍是否运行良好。


您是否使用新贵或监管人员或其他工作来运行芹菜工作者将芹菜节拍作为后台任务?在生产中,您应该使用其中之一来运行芹菜工作者在后台运行芹菜节拍。

运行芹菜节拍的最简单方法是:ps aux | grep -i 'elerybeat'。如果使用pid获得文本字符串,则它正在运行。您还可以使该命令的输出更漂亮:ps aux | grep -i 'elerybeat' | awk '{print $2}'。如果您得到电话号码-它在起作用,如果您什么也没收到-它在行不通。

您还可以检查芹菜工作者的状态:celery -A projectname status

如果您对高级芹菜监控感兴趣,可以阅读官方文档监控指南。

  • 虽然这不是编程方式

您可以通过以下命令检查调度程序是否运行:

1
python manage.py celery worker --beat
  • @MohammedShareefC您安装了celery吗?并且您是否将celery添加到已安装的应用程序中?
  • @MohammedShareefC,您可以通过运行python manage.py检查可用命令的列表
  • 我没有安装djcelery应用。它解决了这个问题。但是,当我安装它时,它开始给出cannot import models错误,指向我的项目代码中的一行。仅当我使用芹菜时才会发生这种情况。