Таймер активен, но не срабатывает
Таймер показывает active (waiting), а служба не запускается ни разу. Чаще всего в unit-файле нет условия срабатывания, включена только служба вместо таймера, или расписание задано так, что момент никогда не наступает.
Что это значит
Проверять таймеры удобно двумя командами. systemctl list-timers --all показывает следующее и прошлое срабатывание для всех таймеров сразу. systemd-analyze calendar "выражение" разбирает расписание и печатает ближайший момент — если она ругается, проблема в записи.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
В секции [Timer] нет ни одного условия срабатывания
Без
OnCalendar=илиOn…Sec=таймер загружается, выглядит активным и никогда не срабатывает. Ошибки при этом нет. -
Включена служба, а не таймер
Команда включения применена к
.service. Служба ждёт запуска извне, а таймер не включён и после перезагрузки не работает. -
Ошибка в календарном выражении
Запись вроде
OnCalendar=*-*-* 25:00:00илиMon,Tue 3:00с опечаткой либо не разбирается, либо задаёт момент, который не наступает. -
Таймер сработал бы, но служба уже активна
Если служба работает постоянно, срабатывание таймера ничего не делает: запускать нечего. Так бывает при
RemainAfterExit=yesу одноразовой задачи. -
Таймер ждёт условия из секции [Unit]
Условия вроде
ConditionPathExists=относятся и к таймерам. Невыполненное условие оставляет таймер неактивным без сообщений об ошибке.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Главная команда: показывает все таймеры, время следующего и прошлого срабатывания. Пустое поле NEXT — таймер не сработает.
systemctl list-timers --all --no-pagerРазбирает расписание и печатает ближайшие срабатывания. Ошибка в записи видна сразу.
systemd-analyze calendar "ваше выражение"Действующее описание таймера со всеми переопределениями.
systemctl cat myapp.timerСобытия самого таймера: включение, срабатывания, условия.
journalctl -u myapp.timer -n 20 --no-pagerРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Без
OnCalendar=илиOn…Sec=таймер загружается, выглядит активным и никогда не срабатывает. Ошибки при этом нет.
- Как проверить
-
Посмотрите unit-файл таймера и список таймеров.
systemctl cat myapp.timer systemctl list-timers --all --no-pager | grep myapp
- Как исправить
-
Добавьте условие срабатывания. Для расписания по времени —
OnCalendar=, для отсчёта от загрузки —OnBootSec=.[Timer] OnCalendar=daily Persistent=true
- Почему происходит
- Команда включения применена к
.service. Служба ждёт запуска извне, а таймер не включён и после перезагрузки не работает.
- Как проверить
-
Посмотрите состояния обоих unit.
systemctl is-enabled myapp.timer myapp.service systemctl status myapp.timer --no-pager | head -8
- Как исправить
-
Включайте именно таймер. Службу при этом в автозапуск ставить не нужно — её вызовет таймер.
sudo systemctl enable --now myapp.timer
- Почему происходит
- Запись вроде
OnCalendar=*-*-* 25:00:00илиMon,Tue 3:00с опечаткой либо не разбирается, либо задаёт момент, который не наступает.
- Как проверить
-
Разберите выражение отдельной командой.
systemd-analyze calendar "*-*-* 03:00:00" systemctl show myapp.timer -p TimersCalendar
- Как исправить
- Исправьте выражение так, чтобы проверка печатала ближайшее срабатывание. Она же покажет, как systemd понял вашу запись.
- Почему происходит
- Если служба работает постоянно, срабатывание таймера ничего не делает: запускать нечего. Так бывает при
RemainAfterExit=yesу одноразовой задачи.
- Как проверить
-
Посмотрите состояние службы.
systemctl status myapp.service --no-pager | head -6 systemctl show myapp.service -p RemainAfterExit -p Type
- Как исправить
-
Уберите
RemainAfterExit=yesу задачи, вызываемой таймером: она должна завершаться, чтобы следующее срабатывание её запустило.
- Почему происходит
- Условия вроде
ConditionPathExists=относятся и к таймерам. Невыполненное условие оставляет таймер неактивным без сообщений об ошибке.
- Как проверить
-
Посмотрите условия таймера.
systemctl show myapp.timer | grep -i "^Condition"
- Как исправить
- Выполните условие или уберите его из unit-файла таймера.
Пример вывода
Таймер активен, но в списке нет времени следующего срабатывания. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
$ systemctl list-timers --all --no-pager
NEXT LEFT LAST PASSED UNIT ACTIVATES
- - - - myapp.timer myapp.service
$ systemctl cat myapp.timer
# /etc/systemd/system/myapp.timer
[Unit]
Description=Run myapp daily
[Timer]
Unit=myapp.service
[Install]
WantedBy=timers.target
В секции [Timer] нет ни OnCalendar=, ни On…Sec= — срабатывать нечему. Поле NEXT в списке пустое, и это главный признак.
Связанные ошибки
- Таймер сработал, а служба не найдена Таймер срабатывает, но запускать нечего: имя службы не совпадает или Unit= указывает на отсутствующий unit.
- Таймер не работает после перезагрузки Таймер работал, пока его запускали вручную, но после перезагрузки не активен: не выполнено включение или нет WantedBy=timers.target.
- Пропущенное срабатывание таймера: Persistent и выключенная машина Таймер не выполнил задачу, потому что в момент срабатывания машина была выключена или служба была недоступна. Как работает Persistent=true.
- Failed with result 'exec-condition' и condition failed Состояния exec-condition и condition failed: запуск не состоялся, потому что условие не выполнено. Это не сбой, а задуманное поведение.
- Failed to parse calendar expression: ошибка в OnCalendar systemd не разбирает календарное выражение таймера. Правила записи OnCalendar и проверка через systemd-analyze calendar.
- Два таймера на одну службу: срабатывания накладываются Одна служба вызывается несколькими таймерами: запуски накладываются, часть срабатываний теряется.
- Задача cron не выполняется Задача в crontab не запускается: короткий PATH, права на файл задачи, точка в имени файла, отсутствие перевода строки.
- A start job is running: загрузка висит на одной службе Загрузка останавливается с обратным отсчётом: служба не укладывается в таймаут. Как найти виновника и не ждать.
Источники
-
systemd.timer(5)
OnCalendar=, On…Sec= и обязательность условия срабатывания. -
systemd-analyze(1)
Команда calendar для разбора расписаний. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено таймером без условия срабатывания: в list-timers поле NEXT пустое.