Таймер срабатывает позже указанного времени
systemd намеренно сдвигает срабатывания в пределах окна точности, чтобы будить систему реже. По умолчанию окно равно минуте, поэтому таймер на ровное время может сработать в любой момент этой минуты. Это не сбой, а поведение по умолчанию, и его нужно учитывать в заданиях, чувствительных к моменту.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Действует окно точности по умолчанию
Срабатывание сдвигается в пределах окна, чтобы совпасть с другими пробуждениями. Задание на 03:00 может пойти в 03:00:47.
-
Добавлена случайная задержка
Случайная задержка разносит одинаковые задания по времени. Она складывается с окном точности, и разброс становится заметным.
-
Момент считается от другого события
Таймеры по времени работы считают от загрузки или от прошлого запуска службы. Ожидание точного календарного момента к ним неприменимо.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Когда таймеры срабатывали и когда сработают.
systemctl list-timers --all --no-pagerОкно точности и случайная задержка.
systemctl show mytask.timer -p AccuracySec -p RandomizedDelaySecФактическое время запусков за неделю.
journalctl -u mytask.service --since "7 days ago" --no-pager | grep -i StartedРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Срабатывание сдвигается в пределах окна, чтобы совпасть с другими пробуждениями. Задание на 03:00 может пойти в 03:00:47.
- Как проверить
-
Посмотрите окно точности и фактическое время срабатываний.
systemctl show mytask.timer -p AccuracySec -p RandomizedDelaySec journalctl -u mytask.service --since "3 days ago" --no-pager | grep -i Started
- Как исправить
-
Сузьте окно точности до секунды, если момент важен. Для остальных заданий окно по умолчанию полезно: оно экономит пробуждения.
[Timer] OnCalendar=*-*-* 03:00:00 AccuracySec=1s
- Почему происходит
- Случайная задержка разносит одинаковые задания по времени. Она складывается с окном точности, и разброс становится заметным.
- Как проверить
-
Посмотрите обе настройки.
systemctl show mytask.timer -p RandomizedDelaySec -p AccuracySec systemctl list-timers mytask.timer --no-pager
- Как исправить
- Уберите случайную задержку там, где нужен точный момент. Для массовых заданий на многих машинах она, наоборот, полезна: снимает одновременную нагрузку.
- Почему происходит
- Таймеры по времени работы считают от загрузки или от прошлого запуска службы. Ожидание точного календарного момента к ним неприменимо.
- Как проверить
-
Посмотрите, как задан момент срабатывания.
systemctl cat mytask.timer | grep -E "^On"
- Как исправить
- Выберите нужный вид: календарный момент задаётся одним параметром, отсчёт от события — другими. Смешивать их в одном таймере можно, но поведение станет неочевидным.
Пример вывода
Задание на ровное время сработало на 47 секунд позже. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
$ systemctl show mytask.timer -p AccuracySec -p RandomizedDelaySec
AccuracySec=1min
RandomizedDelaySec=0
systemd[1]: Started mytask.service - Nightly task.
# в журнале за три дня:
# Sat 03:00:47 Started mytask.service
# Sun 03:00:12 Started mytask.service
# Mon 03:00:39 Started mytask.service
Связанные ошибки
- Пропущенное срабатывание таймера: Persistent и выключенная машина Таймер не выполнил задачу, потому что в момент срабатывания машина была выключена или служба была недоступна. Как работает Persistent=true.
- Failed to parse calendar expression: ошибка в OnCalendar systemd не разбирает календарное выражение таймера. Правила записи OnCalendar и проверка через systemd-analyze calendar.
- Промежутки времени в unit-файле разбираются не так Значения времени без единицы читаются как секунды. Разбор форматов и частых ошибок в таймаутах.
- clocksource: Marking clocksource unstable Ядро переключило источник времени. Службы видят скачки времени, таймеры срабатывают не тогда, когда ожидалось.
- Прыжок системного времени сбивает таймеры и сертификаты После синхронизации времени таймеры срабатывают не вовремя, а проверка сертификатов отказывает. Почему и что делать.
- Служба синхронизации перевела часы скачком Время изменилось резко: расхождение было слишком велико для плавной подстройки. Последствия для таймеров и журнала.
- status=212/TIMERSLACK в systemd Код 212/TIMERSLACK: не удалось задать допуск таймеров процесса из TimerSlackNSec=. Редкий код.
- systemd-resolved: DNSSEC validation failed, имена не разрешаются Часть имён не разрешается при работающей службе: проверка подписей отвергает ответы промежуточного сервера.
Источники
-
systemd.timer(5)
AccuracySec=, RandomizedDelaySec= и группировка пробуждений. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Проверено на systemd 255: без сужения окна срабатывания расходятся в пределах минуты.