我正在我的3D打印服务器上运行一个udev规则,自动创建到一些附加的微控制器板的易于识别的符号链接,它在ubuntu20.04上工作得非常好。该规则在usb供应商和产品ids上触发,并通过程序指令运行python脚本。该脚本连接到微控制器板,并读取它的init序列,以获得该板的“名称”。然后,它输出一个类似于"aaaaaaa“的字符串,并且在udev规则中只使用第一个块(包含名称)。但是,整个程序指令似乎不再执行,因为我将我的系统更新为ubuntu22.04.1。
我的udev规则目前看起来如下(调试时)。它通常只包含第1和第3行。我为测试目的添加了#2,因为第1行中的钩子工作,并且执行了该脚本):
KERNELS=="ttyUSB*", ENV{ID_VENDOR_ID}=="0403", ENV{ID_MODEL_ID}=="6001", ENV{ID_SERIAL_SHORT}!="AI046A0Q", ACTION=="add|remove", RUN="/bin/su me -c \"/opt/me/deviceReg.py -d %k -a %E{ACTION}\""
KERNELS=="ttyUSB*", ENV{ID_VENDOR_ID}=="0403", ENV{ID_MODEL_ID}=="6001", ENV{ID_SERIAL_SHORT}!="AI046A0Q", ACTION=="add|remove", PROGRAM="/opt/me/serialUdev.py -s %s{serial} /dev/%k", SYMLINK+="%c{1}", OWNER="me", GOTO="script_end"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}!="AI046A0Q", PROGRAM="/opt/me/serialUdev.py -s %s{serial} /dev/%k", SYMLINK+="%c{1}", OWNER="me", GOTO="script_end"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A9QXPRV7", SYMLINK+="tty_MainSwitch", GROUP="dialout", OWNER="me", GOTO="script_end"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A9QOIMJ6", SYMLINK+="tty_Cooler", GROUP="dialout", OWNER="me", GOTO="script_end"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A9PTMHGV", SYMLINK+="tty_CurrentTransformer", GROUP="dialout", OWNER="me", GOTO="script_end"
python脚本写入一些日志文件,这些日志文件清楚地指示只执行第1行和第4行、第5行或第6行。
在第3行中有什么东西在最新的udev版本中不再受支持?正如我所说的,在更新系统之前,第3行工作得很好。最后三行是我目前的解决办法。它们工作得很好,但这并不是我想要实现的整个命名系统。
第2和第3行中的python脚本运行得非常好,无论是作为标准用户还是以root用户的身份调用。如果'-s‘输入数据与uc板不匹配,丢失或者是随机垃圾,它也会提供有效的输出。
有谁知道为什么脚本忽略了程序语句的任何行吗?
发布于 2022-08-13 14:29:52
好吧,我解决了这个问题。我也将udev的日志级别设置为调试,查看处理设备时实际发生了什么。脚本实际上被调用,但在导入所需模块时立即失败:无法找到pyserial模块。虽然安装了该模块,但显然无法导入它。
但是,我再次检查了python脚本,并将第一行从#!/usr/bin/env python3
更改为#!/usr/bin/python3
,现在它再次工作。
所以我的问题实际上与udev无关,它只是我的python脚本。
https://stackoverflow.com/questions/73340407
复制相似问题