Ошибка systemd: Watchdog ping failed — Перезапуск зависших служб
Служба периодически перезапускается без видимых аварийных сигналов от самого процесса. В journalctl фиксируется принудительное завершение сторожевым таймером: Watchdog ping failed for service, killing process или Watchdog timeout (WatchdogSec=...), terminating service with SIGABRT.
| Параметр | Назначение | Причина сбоя |
|---|---|---|
WatchdogSec=30s | Интервал ожидания уведомления keep-alive | Приложение не отправило WATCHDOG=1 вовремя |
| Сигнал завершения | SIGABRT (код 134) или SIGKILL | systemd принудительно убил зависший процесс |
| Состояние потоков | Deadlock / High Event Loop Latency | Основной поток блокирован синхронным I/O |
- Процесс переходит в статус
failed (Result: watchdog). - В логах фиксируется генерация core dump из-за получения
SIGABRTпо инициативе systemd.
- Проверьте значение тайм-аута сторожевого таймера в юните:
systemctl cat <service_name> | grep -i WatchdogSec - Определите, почему приложение не успевает отвечать (дедлок или перегрузка CPU/IO):
# Изучите стек потоков перед падением через coredumpctl: coredumpctl gdb <service_name> - Если приложение испытывает высокую нагрузку и не успевает пинговать сокет, временно увеличьте интервал
WatchdogSecв два-три раза:sudo systemctl edit <service_name>.service [Service] WatchdogSec=120s - Убедитесь, что в коде приложения вызов уведомления отправляется в неблокирующем цикле (non-blocking thread):
# В коде на C / Go / Python (sd_notify): sd_notify(0, "WATCHDOG=1"); - Если сторожевой таймер включен ошибочно для ПО без встроенной поддержки systemd notify, отключите его:
[Service] WatchdogSec=0 - Примените изменения и выполните перезапуск:
sudo systemctl daemon-reload sudo systemctl restart <service_name>
WATCHDOG=1 строго с интервалом, равным половине времени WatchdogSec (например, каждые 15 сек при таймауте 30 сек).Частые вопросы (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, может заблокироваться на операциях ввода-вывода, пропустив окно тайм-аута.