udevd: worker terminated by signal 9 — Зависание воркеров udev в Linux
Архитектура ошибки и симптомы сбоя
Сообщение «udevd: worker [PID] terminated by signal 9 (KILL)» (сопровождающееся «worker [PID] timeout, will be killed») генерируется управляющим демоном устройств systemd-udevd. Ошибка означает, что дочерний процесс-воркер (udev worker), обрабатывающий аппаратное событие (подключение диска, смена сетевого интерфейса, опрос multipath или SAS контроллера), превысил допустимый лимит времени обработки события (по умолчанию event_timeout = 180s). Главный демон udev принудительно убивает зависший процесс сигналом SIGKILL (kill -9).
Диагностическая таблица параметров сбоя
| Параметр | Значение | Инженерный смысл сбоя |
|---|---|---|
| systemd-udevd | Device Event Daemon | Служба динамического управления узлами устройств в /dev и назначения прав. |
| event_timeout | 180 sec (Default) | Максимальное время на исполнение скриптов правил (RUN+=...) для одного uevent. |
| Signal 9 (SIGKILL) | Forced Termination | Аварийное уничтожение зависшего воркера для предотвращения паралича udev. |
Пошаговое дерево решений и сценарии траблшутинга
Сценарий 1: Просмотр очереди зависших событий udev в реальном времени
# Просмотр текущей очереди событий udev:
sudo udevadm queue
# Мониторинг входящих аппаратных событий (uevent):
sudo udevadm monitor --propertyСценарий 2: Локализация зависшего скрипта в правилах udev
Запустите тестовую симуляцию обработки события для проблемного блочного устройства:
# Тестовый прогон udev rules для диска sda с подробным дебагом:
sudo udevadm test --action="add" /sys/block/sda
# Поиск тяжелых внешних вызовов (директивы RUN+=, IMPORT{program}=) в каталогах:
# /etc/udev/rules.d/ и /lib/udev/rules.d/
grep -rn "RUN+=" /etc/udev/rules.d/Сценарий 3: Увеличение таймаута event_timeout в конфигурации udev
Если сервер опрашивает медленные ленточные библиотеки, SAN/Multipath или сетевые хранилища:
# Отредактируйте конфигурационный файл /etc/udev/udev.conf:
cat <<EOF | sudo tee -a /etc/udev/udev.conf
event_timeout=300
timeout_signal=SIGABRT
EOF
# Перезапустите службу udev:
sudo systemctl restart systemd-udevdСценарий 4: Отключение зависших helper-утилит (blkid / multipathd / mdadm)
Часто воркер udev зависает на чтении поврежденных суперблоков дисков утилитой blkid:
# Проверьте зависшие процессы в D-state:
ps aux | grep -E "(blkid|multipath|udev)"ITSTM выполнит аудит конфигурации multipath, оптимизацию очередей SAN Fibre Channel и стабилизацию инициализации udev.
Частые вопросы (FAQ)
Почему категорически не рекомендуется выполнять долгие скрипты через udev RUN+=?
Воркеры udev предназначены исключительно для быстрых кратковременных задач назначения прав и символических ссылок. Длительные скрипты (бэкапы, монтирование, сетевые запросы) блокируют очередь udev и гарантированно убиваются по таймауту 180s. Для долгих задач используйте запуск systemd-юнитов через ENV{SYSTEMD_WANTS}+=.
Что происходит с устройством, если воркер udev был убит по Signal 9?
Устройство остается в системе в полуинициализированном состоянии: для него могут отсутствовать симлинки в /dev/disk/by-uuid/, могут не примениться права доступа или не создаться сетевые алиасы (predictable network names).
Как включить максимальный уровень логирования udev для отладки?
Выполните команду: sudo udevadm control --log-priority=debug. Логи начнут подробно записываться в journalctl -u systemd-udevd.
Как перезапустить зависшие воркеры udev без перезагрузки сервера?
Выполните: sudo systemctl restart systemd-udevd && sudo udevadm trigger.