我有几个芹菜任务是通过节拍执行的。在开发过程中,我使用了一个命令来设置它,比如:

celery worker -A my_tasks -n XXXXX@%h -Q for_mytasks -c 1 -E -l INFO -B -s ./config/celerybeat-schedule --pidfile ./config/celerybeat.pid

在开始生产时,我将这个插入到一个脚本中,这个脚本激活了我的venv,设置PYTHONPATH,删除旧的beat文件,cd到正确的目录,然后运行芹菜。这工作非常好。但是,在生产中,我想将worker与beat调度器分开,比如:
celery worker -A my_tasks -n XXXXX@%h -Q for_mytasks -c 1 -E -l INFO -f ./logs/celeryworker.log
celery beat -A my_tasks -s ./config/celerybeat-schedule --pidfile ./config/celerybeat.pid -l INFO -f ./logs/celerybeat.log

现在,当放入相关的bash脚本时,这一切都可以正常工作。但是,我需要这些在服务器启动时运行。我遇到了几个问题:
1)在crontab-e中@reboot my_script不起作用。我必须插入一个延迟以允许rabbitmq完全启动,即@reboot sleep 60 && my_script。现在这对我来说有点“混乱”,但我可以忍受。
2)celery worker需要几秒钟才能正常运行。在worker成功执行beat之后,我尝试了各种cron指令来完成beat的运行,但无法运行beat。我目前在crontab中的解决方案如下:
@reboot sleep 60 && my_script_worker
@reboot sleep 120 && my_script_beat

所以基本上,ubuntu启动,等待60秒运行芹菜工人,然后再等待60秒运行芹菜节拍。这工作很好,但对我来说似乎更“混乱”。在理想情况下,我想标记rabbitmq何时准备好运行worker,然后标记worker何时成功执行,以便我可以运行beat。
我的问题是:有人遇到过这个问题吗?如果有,他们是否有更优雅的方式来解雇芹菜工人,并在服务器重新启动时击败他们?
编辑:2019年9月24日
感谢DejanLekic&Greenev
我花了几个小时把cron转换成systemd。是的,我完全同意这是一个更可靠的解决方案。我的芹菜工人和节拍现在启动的服务,由systemd重新启动。
我有一个建议是给尝试这个的人,芹菜文件中没有提到。template beat命令将在工作目录中创建名为celery beat的“芹菜beat数据库”文件。如果重新启动beat服务,此文件将导致生成虚假的芹菜任务,这些任务似乎不符合您的实际芹菜时间表。解决方案是每次beat服务启动时删除此文件。我还删除了pid文件,如果它在那里的话。为此,我向beat服务添加了2个ExecStartPre和a-s选项:
ExecStartPre=/bin/sh -c 'rm -f ${CELERYBEAT_DB_FILE}'
ExecStartPre=/bin/sh -c 'rm -f ${CELERYBEAT_PID_FILE}'
ExecStart=/bin/sh -c '${CELERY_BIN} beat  \
  -A ${CELERY_APP} --pidfile=${CELERYBEAT_PID_FILE} \
  -s ${CELERYBEAT_DB_FILE} \
  --logfile=${CELERYBEAT_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL}'

谢谢你们。

最佳答案

要对芹菜工人进行守护,我们使用的是systemd,因此工人和节拍可以作为单独的服务运行,并配置为在服务器重新启动时启动,只需使这些服务enabled

10-07 20:26