SystemdDoctor
служба не работает очереди расписание

Планировщик задач запускает задания дважды

Планировщик периодических заданий должен быть один. Два экземпляра дают двойное выполнение: письма уходят дважды, счётчики растут вдвое. Частая причина — планировщик, запущенный и службой, и вручную, либо один файл расписания на два узла.

Вероятные причины

По порядку: сверху то, что встречается чаще.

  1. Планировщик запущен дважды

    Служба и ручной запуск работают одновременно. Каждый ставит задания по своему расписанию.

  2. Файл расписания в общем каталоге

    При хранении расписания на общем разделе два узла пишут в один файл и мешают друг другу.

  3. Планировщик работает на нескольких узлах

    В отказоустойчивой схеме планировщик поднимают на всех узлах. Задания ставятся столько раз, сколько узлов.

Диагностика

Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.

Сколько планировщиков работает на этой машине.

pgrep -a -f "celery.*beat"

Как запускается планировщик и где его расписание.

systemctl cat celery-beat 2>/dev/null

Какие задания и когда ставились.

journalctl -u celery-beat -n 30 --no-pager

Решение

Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.

1. Планировщик запущен дважды
Почему происходит
Служба и ручной запуск работают одновременно. Каждый ставит задания по своему расписанию.
Как проверить
Посмотрите процессы планировщика.
pgrep -a -f "celery.*beat" | head
systemctl is-active celery-beat 2>/dev/null
Как исправить
Оставьте один планировщик и запускайте его только службой. Ручной запуск на боевой машине легко забыть остановить.
2. Файл расписания в общем каталоге
Почему происходит
При хранении расписания на общем разделе два узла пишут в один файл и мешают друг другу.
Как проверить
Посмотрите путь к файлу расписания и тип файловой системы.
systemctl cat celery-beat 2>/dev/null | grep -iE "schedule|ExecStart"
findmnt -T /var/lib/celery -o TARGET,FSTYPE 2>/dev/null
Как исправить
Держите файл расписания на локальном разделе узла и объявляйте каталог через StateDirectory=. Разделять его между узлами нельзя.
3. Планировщик работает на нескольких узлах
Почему происходит
В отказоустойчивой схеме планировщик поднимают на всех узлах. Задания ставятся столько раз, сколько узлов.
Как проверить
Посмотрите, где включена служба планировщика.
systemctl is-enabled celery-beat 2>/dev/null
Как исправить
Планировщик должен работать на одном узле. Для отказоустойчивости используйте внешнюю блокировку или переносите его вслед за общим адресом.

Пример вывода

Планировщик запущен и службой, и вручную. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.

$ pgrep -a -f "celery.*beat"
6100 /opt/app/venv/bin/celery -A app beat --schedule /var/lib/celery/beat-schedule
6240 /opt/app/venv/bin/celery -A app beat

celery-beat[6100]: Scheduler: Sending due task send-digest (app.tasks.send_digest)
celery-beat[6240]: Scheduler: Sending due task send-digest (app.tasks.send_digest)

Связанные ошибки

Источники

  • Документация Celery: периодические задания документация программы
    сверено 15 сентября 2026
  • Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
    Воспроизведено двумя одновременно работающими планировщиками.
    собственная проверка, systemd 255
    сверено 15 сентября 2026