SystemdDoctor
служба не работает устройства зависимости

Служба не останавливается при отключении устройства

Для устройств systemd создаёт unit, за состоянием которых можно следить. Служба, привязанная к устройству, останавливается при его отключении сама. Без привязки она продолжает работать и заполняет журнал ошибками ввода-вывода.

Вероятные причины

По порядку: сверху то, что встречается чаще.

  1. Привязка к устройству не объявлена

    Служба не знает об устройстве. При его исчезновении она остаётся активной и продолжает попытки обращения.

  2. Имя unit устройства указано неверно

    Имя выводится из пути устройства по особым правилам. Написанное вручную легко ошибочно, и привязка не работает.

  3. Устройство не помечено как подходящее для unit

    Не для каждого устройства создаётся unit: это зависит от правил подсистемы устройств. Без метки unit не появляется.

Диагностика

Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.

Какие устройства представлены unit.

systemctl list-units --type=device --all --no-legend | head -20

Верное имя unit для пути устройства.

systemd-escape -p --suffix=device /dev/ttyUSB0

Свойства и метки устройства.

udevadm info /dev/ttyUSB0 2>/dev/null | head -20

Решение

Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.

1. Привязка к устройству не объявлена
Почему происходит
Служба не знает об устройстве. При его исчезновении она остаётся активной и продолжает попытки обращения.
Как проверить
Посмотрите unit устройства и зависимости службы.
systemctl list-units --type=device --no-legend | grep -i usb | head
systemctl show myapp.service -p BindsTo -p After
Как исправить
Объявите жёсткую привязку к unit устройства: при его исчезновении служба остановится сама.
[Unit]
BindsTo=dev-ttyUSB0.device
After=dev-ttyUSB0.device
2. Имя unit устройства указано неверно
Почему происходит
Имя выводится из пути устройства по особым правилам. Написанное вручную легко ошибочно, и привязка не работает.
Как проверить
Посмотрите верное имя unit для устройства.
systemd-escape -p --suffix=device /dev/ttyUSB0
systemctl list-units --type=device --all --no-legend | grep -i ttyusb
Как исправить
Используйте вычисленное имя. Проверить существование unit устройства можно в списке устройств.
3. Устройство не помечено как подходящее для unit
Почему происходит
Не для каждого устройства создаётся unit: это зависит от правил подсистемы устройств. Без метки unit не появляется.
Как проверить
Посмотрите свойства устройства.
udevadm info /dev/ttyUSB0 2>/dev/null | grep -iE "SYSTEMD_WANTS|TAGS" | head
Как исправить
Добавьте правило подсистемы устройств с нужной меткой либо следите за устройством из самой службы. Привязка работает только для помеченных устройств.

Пример вывода

Устройство отключено, служба продолжает обращения. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.

kernel: usb 1-2: USB disconnect, device number 4
kernel: ftdi_sio ttyUSB0: FTDI USB Serial Device converter now disconnected
myapp[9400]: error: read /dev/ttyUSB0: no such device
myapp[9400]: error: read /dev/ttyUSB0: no such device

Связанные ошибки

Источники

  • systemd.device(5)
    Unit устройств и метки подсистемы устройств.
    официальная документация, systemd 255
    сверено 15 сентября 2026
  • systemd.unit(5)
    BindsTo= и остановка вслед за исчезновением unit.
    официальная документация, systemd 255
    сверено 15 сентября 2026
  • Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
    Проверено на systemd 255: без привязки служба остаётся активной после отключения устройства.
    собственная проверка, systemd 255
    сверено 15 сентября 2026