Linux Debian -Распознать USB, к которому подключен определенный порт?

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

Одним из вариантов может быть исследование вывода screen -ls myscreenи сравнение его с «Сокеты не найдены в…» (в отличие от текущего -вывода «Есть экран на...(Отдельный )... 1 Розетка в..." ). Это предполагает, что у вас будет только один запущенный сеанс «myscreen» :

.
while ! screen -ls myscreen | grep -q 'No Sockets found in'; do sleep 1; done

Команда screen -lsпросто анализирует содержимое каталога сокета; вы могли бы посмотреть там сами. Файл сокета обычно помещается в $SCREENDIR; в системе, которую я тестировал, SCREENDIR=/var/run/screen.Цикл ниже будет успешным, если есть хотя бы один файл, соответствующий подстановочному знаку, и завершится, когда таких файлов больше не будет:

while ls /var/run/screen/S-"$LOGNAME"/*.myscreen > /dev/null 2>&1; do sleep 1; done

Это по-прежнему основывается на предположении, что вы запустили только один сеанс экрана с именем «myscreen».

Если вы можете запустить более одного сеанса с одним и тем же именем, вам следует быть более внимательным при выборе PID, соответствующего каждому сеансу.

0
27.11.2020, 06:52
1 ответ

Мой ответ относится к USB; Я не тестировал USB -C специально, так как мне не хватает аппаратного обеспечения. В любом случае это должно дать вам общее представление о том, что вам нужно делать, даже если USB -C может отличаться от USB -1/2/3.

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

Во-первых, вам нужен подход -, управляемый событиями. udevd позволяет вам писать правила, которые срабатывают при добавлении и удалении устройств (при загрузке все обнаруженные устройства запускают событие add, поэтому вам не нужна какая-либо специальная обработка для загрузки ). На первый взгляд, вы можете фильтровать по SUBSYSTEM=usbи DEVTYPE=usb_device. При правильном правиле udevd запустит сценарий обработчика, чтобы сообщить вам, когда устройство добавлено или удалено, с некоторой информацией об этом, такой как тип события и путь к устройству в /sys.

Затем ваш скрипт-обработчик должен будет просмотреть информацию, содержащуюся в /sys, чтобы определить, подключено ли устройство к известному порту на одном из корневых USB-концентраторов (, см./sys/bus/usb/devices/usb[0-9]). Не все добавление/удаление устройства будет переключать свет, поскольку некоторые из них могут быть добавлены/удалены из концентратора, и в этом случае только сам концентратор будет включать свет. Итак, для каждого события проверьте цель символической ссылки на файл port-в имени цели у вас будет имя хаба, за которым следует номер порта.

Например, в моей системе... каждая версия/скорость USB имеет свою собственную шину, поэтому, если я посмотрю на корневые концентраторы:

$ lsusb -t |grep ^/
/:  Bus 09.Port 1: Dev 1, Class=root_hub, Driver=ohci-pci/4p, 12M
/:  Bus 08.Port 1: Dev 1, Class=root_hub, Driver=ohci-pci/2p, 12M
/:  Bus 07.Port 1: Dev 1, Class=root_hub, Driver=ohci-pci/5p, 12M
/:  Bus 06.Port 1: Dev 1, Class=root_hub, Driver=ohci-pci/5p, 12M
/:  Bus 05.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 5000M
/:  Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 480M
/:  Bus 03.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/4p, 480M
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/5p, 480M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/5p, 480M

Шины 1,2,3 и 6,7,9 используют одни и те же физические порты (, они используют один и тот же номер устройства PCI, но различаются только функциями ). То же самое с шинами 4 и 5 (даже с одной и той же функцией PCI, что также объясняет, почему они обе используют один и тот же драйвер xhci ). Шина 8 — только USB1.Некоторые из этих устройств имеют внутренние разъемы USB, так как у меня всего 4 встроенных порта USB2. Возможно даже, что у некоторых вообще нет разъемов, например, зарезервированных для специальных бортовых устройств или других моделей материнских плат, основанных на тех же чипах/печатной плате.

Эта команда просматривает все устройства, подключенные к моему рабочему столу, исключая все интерфейсы (*:*), и печатает символическую ссылку порта под ними:

$ for f in /sys/bus/usb/devices/+([^:])/*port*; do printf '%-32s: %s\n' $f $(readlink $f); done
/sys/bus/usb/devices/1-2.1/port :../1-2:1.0/1-2-port1
/sys/bus/usb/devices/1-2.2/port :../1-2:1.0/1-2-port2
/sys/bus/usb/devices/1-2.4/port :../1-2:1.0/1-2-port4
/sys/bus/usb/devices/1-2/port   :../1-0:1.0/usb1-port2
/sys/bus/usb/devices/4-1/port   :../4-0:1.0/usb4-port1
/sys/bus/usb/devices/5-1.1/port :../5-1:1.0/5-1-port1
/sys/bus/usb/devices/5-1.3/port :../5-1:1.0/5-1-port3
/sys/bus/usb/devices/5-1/port   :../5-0:1.0/usb5-port1
/sys/bus/usb/devices/7-1/port   :../7-0:1.0/usb7-port1

Обратите внимание, что я рассматриваю устройства под /sys/bus/usb/devices/; udev даст вам полный путь от/sys/devices/-они одинаковые; вы можете использовать udevadm info, чтобы получить фактический путь к устройству.

Глядя на это и раскапывая базовую информацию об устройстве, я вижу, что у меня есть концентратор мониторов на usb1-port2с тремя устройствами (клавиатура, мышь, веб-камера на 1 -2 ); На шинах 4/5 есть один концентратор USB3, подключенный к одному и тому же физическому порту usb4-port1и usb5-port1(, EHCI/XHCI )и два устройства USB3 под ним (на 5 -1 ); и, наконец, низкоскоростное -последовательное устройство на usb7-port1.

Если у вас есть концентраторы 2-го уровня внутри вашего устройства, вам нужно будет найти, как их идентифицировать, а также учитывать их порты. Например, мой RPi v3 имеет 4 внешних USB-порта, но когда я смотрю на устройства, встроенный контроллер от SoC имеет только 1 порт USB2, на котором есть концентратор с 5 портами -, первый порт подключает встроенный контроллер USB Ethernet. а оставшиеся 4 являются используемыми портами USB.

Наконец, если у вас более одного корневого концентратора, вам нужен способ надежной идентификации каждого соответствующего концентратора -либо с использованием идентификаторов производителя/модели (, либо с использованием только числовых значений, декодированные имена часто берутся из локального база данных и может быть изменена ), или, если у вас несколько одинаковых концентраторов, идентификатор базовой шины (ex PCI ID, если это устройство PCI/PCIe ). Идентификаторы PCI могут меняться в зависимости от базовой аппаратной (модели материнской платы и, возможно, даже в зависимости от редакции ).но вы можете, по крайней мере, доверять порядку идентификаторов устройств, если корневые устройства всегда используют одни и те же номера слотов. Затем либо на основе спецификаций, либо путем тестирования портов сопоставьте номер порта каждого концентратора с физическим местоположением порта. Вы также можете проверить глубину, если внешний концентратор имеет тот же идентификатор поставщика/модели.


Чтобы настроить udevd , см. справочную страницу man 7 udev. Инструмент udevadmтакже очень полезен для настройки правил, особенно команд info и monitor .

Вы можете использовать lsusbи usbviewи считать атрибуты sysfs для просмотра информации о подключенных устройствах.

Конкретная информация USB -, найденная в sysfs , задокументирована в разделе The Linux -USB Host Side API документации ядра Linux, и многие атрибуты относятся непосредственно к Характеристики USB.

Вы можете найти коды классов USB в https://www.usb.org, которые могут быть полезны для идентификации типов устройств. Более общее описание иерархии конфигурации USB см. в USB in a NutShell Chap. 5 :Дескрипторы USB .

1
18.03.2021, 22:46

Теги

Похожие вопросы