如何使用 udev 规则识别断开连接的 USB 设备?

2024-06-21

我有两个使用 Xorg xinerama 功能的 LCD。每个 LCD 屏幕都有一个触摸屏,连接到各自的 USB 线。

查看“/var/log/messages”文件,我看到以下内容:

kernel: input: Analog Resistive as /class/input/input0
kernel: input: USB HID v1.01 Mouse [Analog Resistive] on usb-0000:00:1d.3-1
kernel: input: Analog Resistive as /class/input/input1
kernel: input: USB HID v1.01 Mouse [Analog Resistive] on usb-0000:00:1d.3-2

由于某种原因,在某个时间点,USB 总线似乎重置了(或者有些奇怪的事情),并且我的两个触摸屏被颠倒了(按左侧 LCD,鼠标在右侧移动,如果我按右侧 LCD,鼠标在右侧移动)左边)。

为了尝试调试问题,我尝试编写一个 udev 规则来记录我的设备重置/断开连接(或其他情况)时的情况。但似乎 udev 在连接时会报告设备上的完整详细信息(产品、制造商、idProduct、idVendor 等),但在删除时只提供一些总线编号。为什么是这样?

当我得到 ACTION==“remove”,KERNEL==“input*” 规则时,我无法知道它是哪个设备!有谁知道解决这个问题的方法吗?


我建议首先检查设备“删除”事件上的 udev 事件,例如运行udevadm monitor --kernel --property --subsystem-match=usb依次断开设备并比较输出。 在一次鼠标断开连接时,我收到两个事件:

KERNEL[6680.737678] remove   /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0 (usb)
ACTION=remove
DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0
DEVTYPE=usb_interface
INTERFACE=3/1/2
MODALIAS=usb:v09DAp000Ad0034dc00dsc00dp00ic03isc01ip02in00
PRODUCT=9da/a/34
SEQNUM=2835
SUBSYSTEM=usb
TYPE=0/0/0

KERNEL[6680.739577] remove   /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2 (usb)
ACTION=remove
BUSNUM=002
DEVNAME=/dev/bus/usb/002/006
DEVNUM=006
DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2
DEVTYPE=usb_device
MAJOR=189
MINOR=133
PRODUCT=9da/a/34
SEQNUM=2836
SUBSYSTEM=usb
TYPE=0/0/0

您可以编写调用脚本的规则,该脚本应该在检查某些特定环境变量后执行一些工作。规则可能很简单

SUBSYSTEM=="usb", ACTION=="remove", RUN+="/usr/local/sbin/usbdevgone.sh"

对于您的情况,我建议检查 usbdevgone.sh 内的 $DEVPATH ,因为它们对于您的两个其他相同的设备应该有所不同。 你也可以通过devpath(这是 /sys/ 文件系统中的路径)作为脚本的参数,如下所示(请参阅man udev获取可用列表substitutions):

SUBSYSTEM=="usb", ACTION=="remove", RUN+="/usr/local/sbin/usbdevgone.sh $devpath"

不要忘记通知 udevd 您的新规则或更改规则udevadm control --reload-rules

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 udev 规则识别断开连接的 USB 设备? 的相关文章

  • 如何在ios开发中从mp3文件中提取元数据

    我正在开发一个带有云存储的 ios 音乐播放器 我需要提取音乐信息 如标题 艺术家 艺术作品 我有一个名为 playit 的操作 可以播放和暂停 mp3 文件 它还应该使用与 mp3 文件关联的元数据来填充一些 UILables 和 UII
  • 如何用JDT获取封闭的方法节点?

    当我有一个调用 bar 的方法 foo 时 如何从 MethodInspiration 节点 或方法中的任何语句 表达式 获取 foo AST 节点 例如 我需要从 b bar 知道 IMethod foo public void foo
  • MySql如何将varchar(纬度,经度)转换为十进制字段?

    在 mysql 中 我有一个 varchar 其中包含 Google 地图提供的纬度和经度 我需要能够基于边界框值进行查询 但不需要现在可用的地理特征 我正在尝试使用 varchar 中找到的 Decimal 值填充 2 个新的 Decim
  • 将 LetsEncrypt 文件复制到 docker 容器

    我不是 docker 专家 我只是在习惯它 我想将主机上生成的 ssl 证书复制到我的 docker 容器 我读到它应该能够与volumesdocker compose 文件中的参数 但启动我的服务器时它总是令人兴奋 因为它无法在工作目录中

随机推荐