在 udev 规则中的脚本未运行

3
我正在一台笔记本电脑上运行Ubuntu 9.10(Karmic Koala),希望根据我的USB键盘是否连接(连接时开启NumLock,未连接时关闭NumLock)自动切换NumLock。
为了实现这一点,我首先安装了“numlockx”软件包。 numlockx onnumlockx off 都可以正常工作。
为了钩入设备系统,我想使用udev。我已经查看了StackOverflow上的其他问题并阅读了"编写udev规则"。但是我无法让udev规则起作用。
首先,这里是dmesg输出的示例:
[20906.985102] usb 3-2: 使用uhci_hcd和地址6的新低速USB设备
[20907.166403] usb 3-2: 已选择配置#1中的1个
[20907.192904] 输入:Microsoft Natural® Ergonomic Keyboard 4000,路径为/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.0/input/input20
[20907.193100] microsoft 0003:045E:00DB.000B: 输入、hidraw1: USB HID v1.11 键盘[Microsoft Natural® Ergonomic Keyboard 4000],位于usb-0000:00:1a.0-2/input0上
[20907.217810] 输入:Microsoft Natural® Ergonomic Keyboard 4000,路径为/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21
[20907.217979] microsoft 0003:045E:00DB.000C: 输入、hidraw2: USB HID v1.11 设备[Microsoft Natural® Ergonomic Keyboard 4000],位于usb-0000:00:1a.0-2/input1上

我使用udevadm info收集设备信息:

> udevadm info -a -p /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21
查看设备 '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21': KERNEL=="input21" SUBSYSTEM=="input" DRIVER=="" ATTR{phys}=="usb-0000:00:1a.0-2/input1" ATTR{uniq}=="" ATTR{modalias}=="input:b0003v045Ep00DBe0111-e0,1,2,3,4,14,k71,72,73,74,75,77,79,7A,7B,7C,7D,7E,7F,80,81,82,83,84,85,86,87,88,89,8A,8B,8C,8E,90,96,98,9B,9C,9E,9F,A1,A3,A4,A5,A6,A7,A8,A9,AB,AC,AD,AE,B0,B1,B2,B3,B4,B5,B6,B8,B9,BA,BB,BC,BD,BE,BF,C0,C1,C2,CE,CF,D0,D1,D2,D5,D9,DB,DF,E2,E7,E8,E9,EA,EB,F0,100,162,166,16A,16E,178,179,17A,17B,17C,17D,17F,180,181,182,185,18C,18D,192,193,195,1A0,1A1,1A2,1A3,1A4,1A5,1A6,1A7,1A8,1A9,1AA,1AB,1AC,1AD,1AE,1B0,1B1,1B7,r6,a20,m4,lsfw"
查看父设备 '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1': KERNELS=="3-2:1.1" SUBSYSTEMS=="usb" DRIVERS=="usbhid" ATTRS{bInterfaceNumber}=="01" ATTRS{bAlternateSetting}==" 0" ATTRS{bNumEndpoints}=="01" ATTRS{bInterfaceClass}=="03" ATTRS{bInterfaceSubClass}=="00" ATTRS{bInterfaceProtocol}=="00" ATTRS{modalias}=="usb:v045Ep00DBd0173dc00dsc00dp00ic03isc00ip00" ATTRS{supports_autosuspend}=="1"
查看父设备 '/devices/pci0000:00/0000:00:1a.0/usb3/3-2': KERNELS=="3-2" SUBSYSTEMS=="usb" DRIVERS=="usb" ATTRS{configuration}=="" ATTRS{bNumInterfaces}==" 2" ATTRS{bConfigurationValue}=="1" ATTRS{bmAttributes}=="a0" ATTRS{bMaxPower}=="100mA" ATTRS{urbnum}=="532" ATTRS{idVendor}=="045e" ATTRS{idProduct}=="00db" ATTRS{bcdDevice}=="0173" ATTRS{bDeviceClass}=="00" ATTRS{bDeviceSubClass}=="00" ATTRS{bDeviceProtocol}=="00" ATTRS{bNumConfigurations}=="1" ATTRS{bMaxPacketSize0}=="8" ATTRS{speed}=="1.5" ATTRS{busnum}=="3" ATTRS{devnum}=="6" ATTRS{version}==" 2.00" ATTRS{maxchild}=="0" ATTRS{quirks}=="0x0" ATTRS{authorized}=="1" ATTRS{manufacturer}=="Microsoft"
查看父设备 '/devices/pci0000:00/0000:00:1a.0/usb3': KERNELS=="usb3" SUBSYSTEMS=="usb" DRIVERS=="usb" ATTRS{configuration}=="" ATTRS{bNumInterfaces}=="
我创建了一个名为/etc/udev/rules.d/usb-keyboard.rules的文件:
# 当键盘插入时打开NumLock。
ACTION=="add", ATTRS{manufacturer}=="Microsoft", SUBSYSTEM=="input", RUN+="/usr/bin/numlockx on"
# 当键盘拔出时关闭NumLock。 ACTION=="remove", ATTRS{manufacturer}=="Microsoft", SUBSYSTEM=="input", RUN+="/usr/bin/numlockx off"
我使用udevadm test验证规则是否正确:
> udevadm test --action=add /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21
run_command: calling: test
udevadm_test: version 147
[...] parse_file: 将'/etc/udev/rules.d/usb-keyboard.rules'作为规则文件读取 udev_rules_new: 规则使用180864字节标记(15072 * 12字节),31614字节缓冲区 udev_rules_new: 临时索引使用49760字节(2488 * 20字节) udev_device_new_from_syspath: 设备0x28d7d80的devpath为'/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21' udev_rules_apply_to_event: 运行'/sbin/modprobe -b $env{MODALIAS}' /lib/udev/rules.d/80-drivers.rules:5 udev_rules_apply_to_event: 运行'socket:@/org/freedesktop/hal/udev_event' /lib/udev/rules.d/90-hal.rules:2 udev_device_new_from_syspath: 设备0x28d8560的devpath为'/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1' udev_device_new_from_syspath: 设备0x28d8708的devpath为'/devices/pci0000:00/0000:00:1a.0/usb3/3-2' udev_rules_apply_to_event: 运行'/usr/bin/numlockx on' /etc/udev/rules.d/usb-keyboard.rules:7 udevadm_test: UDEV_LOG=6 udevadm_test: DEVPATH=/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21 udevadm_test: PRODUCT=3/45e/db/111 udevadm_test: NAME="Microsoft Natural® Ergonomic Keyboard 4000" udevadm_test: PHYS="usb-0000:00:1a.0-2/input1" udevadm_test: UNIQ="" udevadm_test: EV==10001f udevadm_test: KEY==837fff 2c3027 bf004444 0 0 1 10f84 8a27c007 ff7f7bfa d9415fff febeffdf ffefffff ffffffff fffffffe udevadm_test: REL==40 udevadm_test: ABS==1 0 udevadm_test: MSC==10 udevadm_test: MODALIAS=input:b0003v045Ep00DBe0111-e0,1,2,3,4,14,k71,72,73,74,75,77,79,7A,7B,7C,7D,7E,7F,80,81,82,83,84,85,86,87,88,89,8A,8B,8C,8E,90,96,98,9B,9C,9E,9F,A1,A3,A4,A5,A6,A7,A8,A9,AB,AC,AD,AE,B0,B1,B2,B3,B4,B5,B6,B8,B9,BA,BB,BC,BD,BE,BF,C0,C1,C2,CE,CF,D0,D1,D2,D5,D9,DB,DF,E2,E7,E8,E9,EA,EB,F0,100,162,166,16A,16E,178,179,17A,17B,17C,17D,17F,180,181,182,185,18C,18D,192,193,195,1A0,1A1,1A2,1A3,1A4,1A5,1A6,1A7,1A8,1A9,1AA,1AB,1AC,1AD,1AE,1B0,1B1,1B7,r6,a20,m4,lsfw udevadm_test: ACTION=add udevadm_test: SUBSYSTEM=input udevadm_test: 运行:'/sbin/modprobe -b input:b0003v045Ep00DBe0111-e0,1,2,3,4,14,k71,

这是“删除”测试:

> udevadm test --action=remove /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21
运行命令:test udevadm_test版本147
[...] 解析文件:将'/etc/udev/rules.d/usb-keyboard.rules'读取为规则文件 udev_rules_new:规则使用180864字节的标记(15072 * 12字节),31614字节的缓冲区 udev_rules_new:临时索引使用了49760字节(2488 * 20字节) udev_device_new_from_syspath:设备0xd2fd80具有devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21' udev_rules_apply_to_event:运行'socket:@/org/freedesktop/hal/udev_event' /lib/udev/rules.d/90-hal.rules:2 udev_device_new_from_syspath:设备0xd2fff8具有devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1' udev_device_new_from_syspath:设备0xd30690具有devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2' udev_rules_apply_to_event:运行'/usr/bin/numlockx off' /etc/udev/rules.d/usb-keyboard.rules:10 udevadm_test:UDEV_LOG=6 udevadm_test:DEVPATH=/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21 udevadm_test:PRODUCT=3/45e/db/111 udevadm_test:NAME="Microsoft Natural® Ergonomic Keyboard 4000" udevadm_test:PHYS="usb-0000:00:1a.0-2/input1" udevadm_test:UNIQ="" udevadm_test:EV==10001f udevadm_test:KEY==837fff 2c3027 bf004444 0 0 1 10f84 8a27c007 ff7f7bfa d9415fff febeffdf ffefffff ffffffff fffffffe udevadm_test:REL==40 udevadm_test:ABS==1 0 udevadm_test:MSC==10 udevadm_test:MODALIAS=input:b0003v045Ep00DBe0111-e0,1,2,3,4,14,k71,72,73,74,75,77,79,7A,7B,7C,7D,7E,7F,80,81,82,83,84,85,86,87,88,89,8A,8B,8C,8E,90,96,98,9B,9C,9E,9F,A1,A3,A4,A5,A6,A7,A8,A9,AB,AC,AD,AE,B0,B1,B2,B3,B4,B5,B6,B8,B9,BA,BB,BC,BD,BE,BF,C0,C1,C2,CE,CF,D0,D1,D2,D5,D9,DB,DF,E2,E7,E8,E9,EA,EB,F0,100,162,166,16A,16E,178,179,17A,17B,17C,17D,17F,180,181,182,185,18C,18D,192,193,195,1A0,1A1,1A2,1A3,1A4,1A5,1A6,1A7,1A8,1A9,1AA,1AB,1AC,1AD,1AE,1B0,1B1,1B7,r6,a20,m4,lsfw udevadm_test:ACTION=remove udevadm_test:SUBSYSTEM=input udevadm_test:运行'socket:@/org/freedesktop/hal/udev_event' udevadm_test:运行'/usr/bin/numlockx off'
问题在于当键盘插上或拔出时,NumLock状态不会改变。我尝试重新启动udev服务,但没有成功。我的udev规则有问题吗?我的做法是错的吗?
1个回答

1
1. 我对此并不是很了解,但我的猜测是键盘状态由X11 "管道"管理,它位于udev之上的更高级别,因此你在下面所做的任何事情都会被覆盖。您可以通过查看/etc/X11中的配置文件来获取更多信息。 2. 您可能会在superuser.com(本页底部的链接)上获得更相关的答案。我不会在这里关闭您的问题,但其他人可能会。

谢谢你的提示。已复制到SuperUser:http://superuser.com/questions/95187/script-in-udev-rule-doesnt-run - Eric Heikes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接