这能正常工作吗?
CELERYBEAT_SCHEDULE = {
'task-number-one': {
'task': 'project.users.tasks.send_something',
'schedule': crontab(minute='*/2880'),
}
}
答案1
不,这行不通。分钟只能是小时的细分,不考虑超过一小时的时间范围。
在真正的 cron 语法中,这将起作用:
2 2 */2 * * do_something
## run every 2nd day at 2:02
阅读文档来了解如何将其转化为 Celery 的语法。
但请注意:这总是在月初重置,因此在有 29 或 31 天的月份结束时,它将在 24 小时后再次运行。
答案2
我不知道每个 cron 实现,但一般来说,该/
字符可用于引入一步但步骤不会超出系列的末尾。
即分钟数仅为0,1,2,3, ... 59
。实际上只有 30 以内的步数才有意义,因为 的步数*/31
与指定 *“在第 31 分钟运行”相同,并且对于 31-59 之间的每个其他整数也相同。
因此minute='*/2880'
不会按您预期的那样工作。
为了处理奇怪的时间表,一个选项是更频繁地运行批处理,并让批处理本身检测连续运行之间的最小间隔是否已经过去:
在 bash 中它看起来像这样:
#!/bin/bash
# This batch will only run when 420 seconds (7 min) have passed
# since the file /tmp/lastrun was either created or updated
if [ ! -f /tmp/lastrun ] ; then
touch /tmp/lastrun
fi
if [ $(( $(date +%s) - $(date -r /tmp/lastrun +%s) )) -lt 420 ] ; then
echo "The minimum interval of 7 minutes between successive batches hasn't passed yet."
exit
fi
echo "Start running your batch"
date > /tmp/lastrun
然后您可以安全地(尝试)每分钟运行一次:
* * * * * /path/to/your/job
请看这个旧答案我对此以及其他有关如何处理 cron 中的奇怪计划的策略进行了探讨。