每 48 小时运行 cron 的正确语法是什么?

每 48 小时运行 cron 的正确语法是什么?

这能正常工作吗?

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 中的奇怪计划的策略进行了探讨。

相关内容