Таймер не срабатывает, пока машина спит
На машинах, уходящих в сон, таймеры не срабатывают: время идёт, а systemd не будит систему ради задания. Пропущенные срабатывания либо теряются, либо выполняются все сразу после пробуждения — в зависимости от одной настройки.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Таймер не будит систему
По умолчанию таймер не является причиной пробуждения. Во время сна он просто не срабатывает.
-
Пропущенные срабатывания не выполняются
Без запуска пропущенного задание, чей момент прошёл во сне, не выполняется вовсе.
-
После пробуждения запускается сразу много заданий
Включённый запуск пропущенного у нескольких таймеров даёт залп задач в момент пробуждения.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Будит ли таймер систему и выполняет ли пропущенное.
systemctl show mytask.timer -p WakeSystem -p PersistentКогда машина уходила в сон и просыпалась.
journalctl -b --no-pager | grep -iE "suspend|resume" | tailСостояние всех таймеров.
systemctl list-timers --all --no-pagerРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- По умолчанию таймер не является причиной пробуждения. Во время сна он просто не срабатывает.
- Как проверить
-
Посмотрите настройку пробуждения и историю сна.
systemctl show mytask.timer -p WakeSystem journalctl -b --no-pager | grep -iE "suspend|resume" | tail -6
- Как исправить
-
Разрешите таймеру будить систему, если задание должно выполняться по расписанию независимо от сна. Для ноутбуков это заметно расходует заряд.
[Timer] OnCalendar=daily WakeSystem=true
- Почему происходит
- Без запуска пропущенного задание, чей момент прошёл во сне, не выполняется вовсе.
- Как проверить
-
Посмотрите настройку запуска пропущенного и время последнего срабатывания.
systemctl show mytask.timer -p Persistent -p LastTriggerUSec
- Как исправить
- Включите запуск пропущенного: после пробуждения задание выполнится один раз, даже если моментов было несколько.
- Почему происходит
- Включённый запуск пропущенного у нескольких таймеров даёт залп задач в момент пробуждения.
- Как проверить
-
Посмотрите таймеры с включённым запуском пропущенного.
systemctl list-timers --all --no-pager | head -15
- Как исправить
- Разнесите такие задания случайной задержкой. Одновременный запуск всех отложенных задач делает машину неотзывчивой на минуты.
Пример вывода
Задание пропущено: машина спала в нужный момент. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
systemd[1]: Reached target sleep.target - Sleep.
systemd-sleep[9100]: Entering sleep state 'suspend'...
# три часа сна, момент срабатывания пройден
systemd-sleep[9100]: System returned from sleep state.
$ systemctl show mytask.timer -p WakeSystem -p Persistent
WakeSystem=no
Persistent=no
Связанные ошибки
- Пропущенное срабатывание таймера: Persistent и выключенная машина Таймер не выполнил задачу, потому что в момент срабатывания машина была выключена или служба была недоступна. Как работает Persistent=true.
- Таймер срабатывает позже указанного времени Задание запускается на минуту позже: по умолчанию таймеры группируются для экономии пробуждений.
- Таймер активен, но не срабатывает Таймер systemd в состоянии active, но служба не запускается. Разбор: нет условия срабатывания, таймер не включён, ошибка в OnCalendar.
- Failed to parse calendar expression: ошибка в OnCalendar systemd не разбирает календарное выражение таймера. Правила записи OnCalendar и проверка через systemd-analyze calendar.
- clocksource: Marking clocksource unstable Ядро переключило источник времени. Службы видят скачки времени, таймеры срабатывают не тогда, когда ожидалось.
- status=212/TIMERSLACK в systemd Код 212/TIMERSLACK: не удалось задать допуск таймеров процесса из TimerSlackNSec=. Редкий код.
- Два таймера на одну службу: срабатывания накладываются Одна служба вызывается несколькими таймерами: запуски накладываются, часть срабатываний теряется.
- Периодическая очистка неиспользуемых блоков не работает Задача очистки блоков падает: файловая система или устройство не поддерживают операцию, либо путь смонтирован не так.
Источники
-
systemd.timer(5)
WakeSystem= и Persistent=. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Проверено на systemd 255: во время сна таймер без разрешения не будит систему.