Вопрос или проблема
Я исследовал проблему, которая, похоже, связана с watchdog systemd, но безуспешно. У меня есть несколько служб типа Type=notify
. Если системное время установлено назад, каждая служба убивается systemd, потому что он считает, что таймаут watchdog был превышен. Вот отладочный журнал от systemd:
systemd[1]: xxx:service: Юнит вошел в состояние ошибки.
systemd[1]: xxx:service: Неудача с результатом 'watchdog'.
Есть ли способ сказать Systemd не перезапускать службы, когда системное время изменяется вручную?
Разве не должно watchdog зависеть от CLOCK_MONOTONIC
? Это известная проблема в Systemd?
Есть ли способ сказать Systemd не перезапускать службы, когда системное время изменяется вручную?
Нет. Согласно документации в man systemd.service
для WatchDogSec=
, нет гарантии, что systemd будет отслеживать это, используя монотонный таймер, так что это работает так, как заявлено.
Если вы считаете, что поведение следует изменить, вы можете обсудить это с разработчиками systemd или открыть проблему:
https://github.com/systemd/systemd/issues?utf8=%E2%9C%93&q=WatchDogSec%3D
Ответ или решение
Проблема, с которой вы столкнулись, связана с механизмом работы системного менеджера systemd и его интеграцией с функцией мониторинга (watchdog) для служб, которые настроены с использованием параметра Type=notify
. Давайте подробно рассмотрим эту ситуацию.
Причины проблемы
Когда вы вручную изменяете системное время назад, systemd может интерпретировать это как превышение времени ожидания (timeout) для службы с активированным watchdog, что приводит к её автоматическому завершению. Это поведение, к сожалению, не зависит от типа таймера, который поддерживает система. Как вы уже заметили, в документации по man systemd.service
указано, что параметр WatchDogSec=
не гарантирует использование монотонного таймера, что означает, что изменения системного времени могут оказывать влияние на работу служб.
Решение проблемы
К сожалению, нет прямого способа отключить автоматическую перезапуск служб systemd при изменении системного времени. Если вы хотите, чтобы systemd не перезапускал службы в таких ситуациях, вам потребуется изменить подход к мониторингу этих служб. Вот несколько возможных подходов:
-
Измените параметры службы:
Рассмотрите возможность изменения типа службы сType=notify
наType=simple
илиType=forking
, если это возможно в вашем случае. Таким образом, вы исключите использование watchdog для этих служб. -
Переопределение поведения watchdog:
Если используется watchdog, вам стоит попробовать увеличить значение параметраWatchDogSec=
, чтобы обеспечить большее время на реакцию для служб, если они почувствуют "падение" времени. -
Обсуждение с разработчиками:
Если вы считаете, что такая логика работы systemd является проблемой, вы можете поднять этот вопрос (или создать проблему) в репозитории на GitHub для systemd. Обсуждение с разработчиками может привести к изменению текущего поведения.Ссылка для обсуждения: GitHub – systemd issues
Заключение
Проблема, с которой вы столкнулись, подчеркивает важность понимания работы системных сервисов и их взаимосвязи с системными часами. Изменения системного времени могут привести к неожиданным последствиям для работающих служб, и возможности их настройки ограничены. Тем не менее, изучение возможных обходных решений и взаимодействие с сообществом разработчиков могут помочь вам найти оптимальный путь для минимизации таких проблем в будущем.
Если у вас есть еще вопросы или вам нужна дальнейшая помощь, не стесняйтесь обращаться!