Два таймера на одну службу: срабатывания накладываются
Несколько таймеров могут вызывать одну службу. Пока она активна, новые срабатывания ничего не делают: задание просто не создаётся. Для одноразовых задач это значит потерянные запуски.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Срабатывания приходятся на время работы задачи
Задача выполняется дольше промежутка между срабатываниями. Второй таймер срабатывает в пустоту.
-
Расписания задают одно и то же время
Два таймера с пересекающимися расписаниями — обычно следствие копирования файлов. Один из них лишний.
-
Нужны параллельные запуски
Если задача должна выполняться несколько раз одновременно с разными параметрами, обычная служба этого не позволяет.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Все таймеры, их расписания и вызываемые службы.
systemctl list-timers --all --no-pager | head -20Сколько раз задача фактически запускалась.
journalctl -u myapp.service --since "1 day ago" --no-pager | grep -ciE "started"Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Задача выполняется дольше промежутка между срабатываниями. Второй таймер срабатывает в пустоту.
- Как проверить
-
Посмотрите все таймеры, вызывающие службу, и время её работы.
systemctl list-timers --all --no-pager | grep myapp journalctl -u myapp.service --no-pager | grep -iE "started|finished" | tail -6
- Как исправить
- Оставьте один таймер и настройте расписание с запасом относительно времени выполнения. Для параллельных запусков нужна шаблонная служба с разными экземплярами.
- Почему происходит
- Два таймера с пересекающимися расписаниями — обычно следствие копирования файлов. Один из них лишний.
- Как проверить
-
Посмотрите расписания.
systemctl show myapp.timer myapp-daily.timer -p TimersCalendar 2>/dev/null
- Как исправить
-
Удалите дублирующий таймер:
systemctl disable --nowи уберите файл.
- Почему происходит
- Если задача должна выполняться несколько раз одновременно с разными параметрами, обычная служба этого не позволяет.
- Как проверить
-
Посмотрите, чем различаются запуски.
systemctl cat myapp.service | grep ExecStart
- Как исправить
-
Сделайте службу шаблонной и вызывайте экземпляры:
myapp@utro.serviceиmyapp@vecher.serviceработают независимо.
Пример вывода
Второе срабатывание пришло, пока задача работала. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
systemd[1]: myapp-hourly.timer: Triggering OnCalendar=hourly
systemd[1]: myapp.service: Start request repeated too quickly.
# либо тише: задание не создаётся вовсе, потому что служба активна
Связанные ошибки
- Таймер активен, но не срабатывает Таймер systemd в состоянии active, но служба не запускается. Разбор: нет условия срабатывания, таймер не включён, ошибка в OnCalendar.
- start-limit-hit: служба заблокирована после серии перезапусков Состояние start-limit-hit и сообщение start request repeated too quickly: systemd перестал перезапускать службу. Как разблокировать и найти исходную причину.
- Одноразовая задача: как не получить ложный сбой Правильная настройка Type=oneshot: RemainAfterExit, коды возврата, зависимости и вызов по таймеру.
- Failed to parse calendar expression: ошибка в OnCalendar systemd не разбирает календарное выражение таймера. Правила записи OnCalendar и проверка через systemd-analyze calendar.
- Пропущенное срабатывание таймера: Persistent и выключенная машина Таймер не выполнил задачу, потому что в момент срабатывания машина была выключена или служба была недоступна. Как работает Persistent=true.
- clocksource: Marking clocksource unstable Ядро переключило источник времени. Службы видят скачки времени, таймеры срабатывают не тогда, когда ожидалось.
- status=212/TIMERSLACK в systemd Код 212/TIMERSLACK: не удалось задать допуск таймеров процесса из TimerSlackNSec=. Редкий код.
- Задача cron не выполняется Задача в crontab не запускается: короткий PATH, права на файл задачи, точка в имени файла, отсутствие перевода строки.
Источники
-
systemd.timer(5)
Связь таймера и службы, параметр Unit=. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Проверено двумя таймерами на одну задачу длительностью больше промежутка.