SystemdDoctor
служба не работает частое таймеры расписание

Таймер активен, но не срабатывает

Таймер показывает active (waiting), а служба не запускается ни разу. Чаще всего в unit-файле нет условия срабатывания, включена только служба вместо таймера, или расписание задано так, что момент никогда не наступает.

Что это значит

Проверять таймеры удобно двумя командами. systemctl list-timers --all показывает следующее и прошлое срабатывание для всех таймеров сразу. systemd-analyze calendar "выражение" разбирает расписание и печатает ближайший момент — если она ругается, проблема в записи.

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

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

  1. В секции [Timer] нет ни одного условия срабатывания

    Без OnCalendar= или On…Sec= таймер загружается, выглядит активным и никогда не срабатывает. Ошибки при этом нет.

  2. Включена служба, а не таймер

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

  3. Ошибка в календарном выражении

    Запись вроде OnCalendar=*-*-* 25:00:00 или Mon,Tue 3:00 с опечаткой либо не разбирается, либо задаёт момент, который не наступает.

  4. Таймер сработал бы, но служба уже активна

    Если служба работает постоянно, срабатывание таймера ничего не делает: запускать нечего. Так бывает при RemainAfterExit=yes у одноразовой задачи.

  5. Таймер ждёт условия из секции [Unit]

    Условия вроде ConditionPathExists= относятся и к таймерам. Невыполненное условие оставляет таймер неактивным без сообщений об ошибке.

Диагностика

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

Главная команда: показывает все таймеры, время следующего и прошлого срабатывания. Пустое поле NEXT — таймер не сработает.

systemctl list-timers --all --no-pager

Разбирает расписание и печатает ближайшие срабатывания. Ошибка в записи видна сразу.

systemd-analyze calendar "ваше выражение"

Действующее описание таймера со всеми переопределениями.

systemctl cat myapp.timer

События самого таймера: включение, срабатывания, условия.

journalctl -u myapp.timer -n 20 --no-pager

Решение

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

1. В секции [Timer] нет ни одного условия срабатывания
Почему происходит
Без OnCalendar= или On…Sec= таймер загружается, выглядит активным и никогда не срабатывает. Ошибки при этом нет.
Как проверить
Посмотрите unit-файл таймера и список таймеров.
systemctl cat myapp.timer
systemctl list-timers --all --no-pager | grep myapp
Как исправить
Добавьте условие срабатывания. Для расписания по времени — OnCalendar=, для отсчёта от загрузки — OnBootSec=.
[Timer]
OnCalendar=daily
Persistent=true
2. Включена служба, а не таймер
Почему происходит
Команда включения применена к .service. Служба ждёт запуска извне, а таймер не включён и после перезагрузки не работает.
Как проверить
Посмотрите состояния обоих unit.
systemctl is-enabled myapp.timer myapp.service
systemctl status myapp.timer --no-pager | head -8
Как исправить
Включайте именно таймер. Службу при этом в автозапуск ставить не нужно — её вызовет таймер.
sudo systemctl enable --now myapp.timer
3. Ошибка в календарном выражении
Почему происходит
Запись вроде OnCalendar=*-*-* 25:00:00 или Mon,Tue 3:00 с опечаткой либо не разбирается, либо задаёт момент, который не наступает.
Как проверить
Разберите выражение отдельной командой.
systemd-analyze calendar "*-*-* 03:00:00"
systemctl show myapp.timer -p TimersCalendar
Как исправить
Исправьте выражение так, чтобы проверка печатала ближайшее срабатывание. Она же покажет, как systemd понял вашу запись.
4. Таймер сработал бы, но служба уже активна
Почему происходит
Если служба работает постоянно, срабатывание таймера ничего не делает: запускать нечего. Так бывает при RemainAfterExit=yes у одноразовой задачи.
Как проверить
Посмотрите состояние службы.
systemctl status myapp.service --no-pager | head -6
systemctl show myapp.service -p RemainAfterExit -p Type
Как исправить
Уберите RemainAfterExit=yes у задачи, вызываемой таймером: она должна завершаться, чтобы следующее срабатывание её запустило.
5. Таймер ждёт условия из секции [Unit]
Почему происходит
Условия вроде 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 в списке пустое, и это главный признак.

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

Источники

  • systemd.timer(5)
    OnCalendar=, On…Sec= и обязательность условия срабатывания.
    официальная документация, systemd 255
    сверено 15 сентября 2026
  • systemd-analyze(1)
    Команда calendar для разбора расписаний.
    официальная документация, systemd 255
    сверено 15 сентября 2026
  • Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
    Воспроизведено таймером без условия срабатывания: в list-timers поле NEXT пустое.
    собственная проверка, systemd 255
    сверено 15 сентября 2026