Это будет работать правильно?
CELERYBEAT_SCHEDULE = {
'task-number-one': {
'task': 'project.users.tasks.send_something',
'schedule': crontab(minute='*/2880'),
}
}
Нет, это не сработает. Минуты могут быть только частями часа и не рассматривать временные рамки длиннее одного часа.
В реальном синтаксисе cron это будет работать:
2 2 */2 * * do_something
## run every 2nd day at 2:02
Прочтите документацию, чтобы узнать, как это переводится в синтаксис Celery.
Однако обратите внимание: он всегда сбрасывается в начале месяца, поэтому в конце месяцев с 29 или 31 днем он будет запускаться снова уже через 24 часа.
Я не знаю всех реализаций 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.