Центр Диагностики & База Системных Ошибок

Решения для Windows Server, Active Directory, 1С, СУБД, Linux, Cisco, MikroTik и IP-телефонии.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, баз данных и сетевого оборудования. Перед выполнением действий обязательно создайте резервную копию. При отсутствии необходимой квалификации обратитесь к ИТ-специалистам.
systemd Error: Watchdog ping failed for service, killing process Linux / DevOps

Ошибка systemd: Watchdog ping failed — Перезапуск зависших служб

Обновлено: 18.08.2026  ·  Официальная база знаний

Служба периодически перезапускается без видимых аварийных сигналов от самого процесса. В journalctl фиксируется принудительное завершение сторожевым таймером: Watchdog ping failed for service, killing process или Watchdog timeout (WatchdogSec=...), terminating service with SIGABRT.

ПараметрНазначениеПричина сбоя
WatchdogSec=30sИнтервал ожидания уведомления keep-aliveПриложение не отправило WATCHDOG=1 вовремя
Сигнал завершенияSIGABRT (код 134) или SIGKILLsystemd принудительно убил зависший процесс
Состояние потоковDeadlock / High Event Loop LatencyОсновной поток блокирован синхронным I/O
  • Процесс переходит в статус failed (Result: watchdog).
  • В логах фиксируется генерация core dump из-за получения SIGABRT по инициативе systemd.
  1. Проверьте значение тайм-аута сторожевого таймера в юните:
    systemctl cat <service_name> | grep -i WatchdogSec
  2. Определите, почему приложение не успевает отвечать (дедлок или перегрузка CPU/IO):
    # Изучите стек потоков перед падением через coredumpctl:
    coredumpctl gdb <service_name>
  3. Если приложение испытывает высокую нагрузку и не успевает пинговать сокет, временно увеличьте интервал WatchdogSec в два-три раза:
    sudo systemctl edit <service_name>.service
    
    [Service]
    WatchdogSec=120s
  4. Убедитесь, что в коде приложения вызов уведомления отправляется в неблокирующем цикле (non-blocking thread):
    # В коде на C / Go / Python (sd_notify):
    sd_notify(0, "WATCHDOG=1");
  5. Если сторожевой таймер включен ошибочно для ПО без встроенной поддержки systemd notify, отключите его:
    [Service]
    WatchdogSec=0
  6. Примените изменения и выполните перезапуск:
    sudo systemctl daemon-reload
    sudo systemctl restart <service_name>
Архитектурная рекомендация: Сторожевой таймер (Keep-Alive Watchdog) должен отправлять уведомление WATCHDOG=1 строго с интервалом, равным половине времени WatchdogSec (например, каждые 15 сек при таймауте 30 сек).
Практический опыт инженера: Не выносите `sd_notify("WATCHDOG=1")` в абсолютно изолированный таймер-поток без проверки живости рабочих воркеров — это создает иллюзию работы при фактически «зависшем» сервисе.

Частые вопросы (FAQ)

Как работает механизм Watchdog в systemd?

systemd передает приложению путь к UNIX-сокету через переменную окружения NOTIFY_SOCKET. Приложение обязано периодически слать строку 'WATCHDOG=1' в этот сокет. Если за время WatchdogSec сообщение не получено, systemd считает процесс зависшим и убивает его.

Какой сигнал отправляет systemd процессу при таймауте Watchdog?

По умолчанию отправляется сигнал SIGABRT (что позволяет ядру сгенерировать core dump для последующего анализа причин зависания), а затем SIGKILL, если процесс не завершился.

Как полностью отключить проверку Watchdog для юнита?

Установите WatchdogSec=0 (или удалите эту директиву) в конфигурации сервиса и выполните daemon-reload.

Почему Watchdog убивает базу данных при высоких нагрузках?

Если дисковая подсистема перегружена (100% I/O wait), поток демона, отвечающий за sd_notify, может заблокироваться на операциях ввода-вывода, пропустив окно тайм-аута.