#Когда возникает ошибка в Debian и какие условия важны
Таймер systemd Debian срабатывает до перехода в сон, но не выполняет ожидаемое действие после пробуждения. Таймеры OnCalendar и монотонные OnUnitActiveSec работают по-разному; не каждый пропущенный запуск должен автоматически догоняться.
#Причины и как отличить их друг от друга
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Таймер пропущен во время сна | В журнале виден уход в suspend, затем отсутствует ожидаемое событие. | Сверить расписание и Persistent= для календарного таймера. |
| Служба остаётся активной | Активированный service с RemainAfterExit=yes не запускается повторно. | Проверить состояние вызываемого сервиса. |
| Не готова сеть после выхода из сна | Таймер сработал, но запрос сервиса завершился ошибкой связи. | Проверить журнал именно вызванной службы и зависимости. |
#Пошаговая диагностика и устранение
- 1. Уточните имя timer и фактические моменты выполненияВ терминале Debian выполните list-timers --all. Столбцы NEXT, LEFT, LAST и PASSED показывают планирование, а не успешное завершение задания. Подставьте точное имя ИМЯ.timer и не путайте его с ИМЯ.service; иногда Unit= указывает совершенно другое имя службы.
- Чтение данных и диагностикаLinux · Терминал (Bash)КомандаЧтение данных и диагностика. Изменений нет.
systemctl list-timers --all --no-pagersystemctl status ИМЯ.timer --no-pager
- 2. Прочитайте календарные или монотонные правилаОткройте unit командой cat, найдите [Timer] и поля OnCalendar, OnBootSec, OnUnitActiveSec, AccuracySec, Persistent и WakeSystem. Для OnCalendar можно использовать systemd-analyze calendar с реальным выражением; не меняйте его, пока не проверите часовой пояс сервера.
- Чтение данных и диагностикаLinux · Терминал (Bash)КомандаЧтение данных и диагностика. Изменений нет.
systemctl cat ИМЯ.timertimedatectl
- 3. Сопоставьте журнал сна с журналом заданияПосмотрите journalctl для timer и активируемой службы в текущей загрузке. Вывод покажет, активировался ли таймер и как закончилась сама программа; упоминание timer без запуска service не равно успеху. Для системного сна ищите сообщения suspend/resume, учитывая возможную недоступность прошлого журнала.Linux · Терминал (Bash)КомандаЧтение данных и диагностика. Изменений нет.
journalctl -b -u ИМЯ.timer -u ИМЯ.service --no-pager -n 120journalctl -b --grep="suspend|resume" --no-pager -n 80
- 4. Определите, допустимо ли выполнение пропущенной задачиЕсли используется OnCalendar и задача должна догоняться после выключения, изучите Persistent=yes. Это касается только календарных таймеров, которые были неактивны в момент события; для каждого монотонного интервала включение Persistent не является универсальным исправлением.
- Чтение данных и диагностикаLinux · Терминал (Bash)КомандаЧтение данных и диагностика. Изменений нет.
systemctl show ИМЯ.timer -p NextElapseUSecRealtime -p NextElapseUSecMonotonicsystemctl show ИМЯ.service -p ActiveState -p RemainAfterExit
- 5. Устраните зависание активируемой службыЕсли service остаётся active после успешного одноразового выполнения, проверьте Type=oneshot и RemainAfterExit. Система не обязана запускать уже активную службу повторно. Не меняйте RemainAfterExit без понимания последствий: перед правкой сохраните исходный unit и результат его последнего исполнения.
- Чтение данных и диагностикаLinux · Терминал (Bash)КомандаЧтение данных и диагностика. Изменений нет.
systemctl cat ИМЯ.servicesystemctl status ИМЯ.service --no-pager
- 6. Проверьте изменения без принудительного снаДля собственного таймера используйте sudo systemctl edit ИМЯ.timer и укажите только обоснованную настройку в [Timer], например Persistent=yes для OnCalendar. Затем проверьте параметры и дождитесь штатного события. Не запускайте sleep/suspend на удалённом производственном сервере ради теста.Linux · Терминал (Bash)С осторожностьюНужен sudoФайл переопределения позволяет удалить собственное изменение без правки пакета.
sudo systemctl edit ИМЯ.timersystemctl cat ИМЯ.timerКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
- 7. Подтвердите выполнение сервисом нужной операцииПосле реального пробуждения проверьте LAST в list-timers и журнал запускаемой службы. Только запись об успешно выполненной операции считается результатом. Если выполнен timer, но служба сообщает ошибку DNS или базы, исправлять нужно готовность нужной зависимости.
- Чтение данных и диагностикаLinux · Терминал (Bash)КомандаЧтение данных и диагностика. Изменений нет.
systemctl list-timers --all --no-pagerjournalctl -u ИМЯ.service -b --no-pager -n 45
#Проверка результата и действия при неуспехе
Таймер исправлен, когда после пробуждения в нужный момент действительно выполнено задание, не запущено повторно ненужное действие и не потерян результат.