Какой правильный синтаксис для запуска cron каждые 48 часов?
Будет ли это работать правильно?
CELERYBEAT_SCHEDULE = {
'task-number-one': {
'task': 'project.users.tasks.send_something',
'schedule': crontab(minute='*/2880'),
}
}
2 ответа
Нет, это не сработает. Минуты могут быть только частями часа и не учитывать временные рамки, превышающие один час.
В реальном синтаксисе 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.