3 Stimmen

Skript in udev-Regel wird nicht ausgeführt

Ich verwende Ubuntu 9.10 (Karmic Koala) auf einem Laptop und möchte, dass die NumLock-Funktion automatisch umgeschaltet wird, je nachdem, ob meine USB-Tastatur eingesteckt (Numlock ein) oder ausgesteckt (Numlock aus) ist.

Um dies zu erreichen, habe ich zunächst das Paket "numlockx" installiert. numlockx on y numlockx off funktioniert gut.

Um mich in das Gerätesystem einzuklinken, dachte ich, ich würde udev verwenden. Ich habe mir andere Fragen auf StackOverflow angesehen und gelesen "udev-Regeln schreiben" . Aber ich habe Probleme, die udev-Regel zum Laufen zu bringen.

Zunächst ein Beispiel für die dmesg Ausgabe:

\[20906.985102\] usb 3-2: new low speed USB device using uhci\_hcd and address 6
\[20907.166403\] usb 3-2: configuration #1 chosen from 1 choice
\[20907.192904\] input: Microsoft Natural® Ergonomic Keyboard 4000 as /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.0/input/input20
\[20907.193100\] microsoft 0003:045E:00DB.000B: input,hidraw1: USB HID v1.11 Keyboard \[Microsoft Natural® Ergonomic Keyboard 4000\] on usb-0000:00:1a.0-2/input0
\[20907.217810\] input: Microsoft Natural® Ergonomic Keyboard 4000 as /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21
\[20907.217979\] microsoft 0003:045E:00DB.000C: input,hidraw2: USB HID v1.11 Device \[Microsoft Natural® Ergonomic Keyboard 4000\] on usb-0000:00:1a.0-2/input1

Utilicé udevadm info um die Geräteinformationen zu sammeln:

\> udevadm info -a -p /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21

  looking at device '/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"

  looking at parent device '/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"

  looking at parent device '/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"

  looking at parent device '/devices/pci0000:00/0000:00:1a.0/usb3':
    KERNELS=="usb3"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{configuration}==""
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bmAttributes}=="e0"
    ATTRS{bMaxPower}=="  0mA"
    ATTRS{urbnum}=="127"
    ATTRS{idVendor}=="1d6b"
    ATTRS{idProduct}=="0001"
    ATTRS{bcdDevice}=="0206"
    ATTRS{bDeviceClass}=="09"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{speed}=="12"
    ATTRS{busnum}=="3"
    ATTRS{devnum}=="1"
    ATTRS{version}==" 1.10"
    ATTRS{maxchild}=="2"
    ATTRS{quirks}=="0x0"
    ATTRS{authorized}=="1"
    ATTRS{manufacturer}=="Linux 2.6.31-16-generic uhci\_hcd"
    ATTRS{product}=="UHCI Host Controller"
    ATTRS{serial}=="0000:00:1a.0"
    ATTRS{authorized\_default}=="1"

  looking at parent device '/devices/pci0000:00/0000:00:1a.0':
    KERNELS=="0000:00:1a.0"
    SUBSYSTEMS=="pci"
    DRIVERS=="uhci\_hcd"
    ATTRS{vendor}=="0x8086"
    ATTRS{device}=="0x2937"
    ATTRS{subsystem\_vendor}=="0x1558"
    ATTRS{subsystem\_device}=="0x0860"
    ATTRS{class}=="0x0c0300"
    ATTRS{irq}=="16"
    ATTRS{local\_cpus}=="ff"
    ATTRS{local\_cpulist}=="0-7"
    ATTRS{modalias}=="pci:v00008086d00002937sv00001558sd00000860bc0Csc03i00"
    ATTRS{broken\_parity\_status}=="0"
    ATTRS{msi\_bus}==""

  looking at parent device '/devices/pci0000:00':
    KERNELS=="pci0000:00"
    SUBSYSTEMS==""
    DRIVERS==""

Ich habe also eine Datei mit dem Namen /etc/udev/rules.d/usb-keyboard.rules :

\# Turn on NumLock when keyboard is plugged in.
ACTION=="add", ATTRS{manufacturer}=="Microsoft", SUBSYSTEM=="input", RUN+="/usr/bin/numlockx on"

# Turn off NumLock when keyboard is unplugged.
ACTION=="remove", ATTRS{manufacturer}=="Microsoft", SUBSYSTEM=="input", RUN+="/usr/bin/numlockx off"

Ich habe verwendet udevadm test um zu überprüfen, ob die Regeln korrekt sind:

\> 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: reading '/etc/udev/rules.d/usb-keyboard.rules' as rules file
udev\_rules\_new: rules use 180864 bytes tokens (15072 \* 12 bytes), 31614 bytes buffer
udev\_rules\_new: temporary index used 49760 bytes (2488 \* 20 bytes)
udev\_device\_new\_from\_syspath: device 0x28d7d80 has devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21'
udev\_rules\_apply\_to\_event: RUN '/sbin/modprobe -b $env{MODALIAS}' /lib/udev/rules.d/80-drivers.rules:5
udev\_rules\_apply\_to\_event: RUN 'socket:@/org/freedesktop/hal/udev\_event' /lib/udev/rules.d/90-hal.rules:2
udev\_device\_new\_from\_syspath: device 0x28d8560 has devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1'
udev\_device\_new\_from\_syspath: device 0x28d8708 has devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2'
udev\_rules\_apply\_to\_event: RUN '/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: run: '/sbin/modprobe -b 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: run: 'socket:@/org/freedesktop/hal/udev\_event'
udevadm\_test: run: '/usr/bin/numlockx on'

Und hier ist der "Entfernen"-Test:

\> udevadm test --action=remove /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: reading '/etc/udev/rules.d/usb-keyboard.rules' as rules file
udev\_rules\_new: rules use 180864 bytes tokens (15072 \* 12 bytes), 31614 bytes buffer
udev\_rules\_new: temporary index used 49760 bytes (2488 \* 20 bytes)
udev\_device\_new\_from\_syspath: device 0xd2fd80 has devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21'
udev\_rules\_apply\_to\_event: RUN 'socket:@/org/freedesktop/hal/udev\_event' /lib/udev/rules.d/90-hal.rules:2
udev\_device\_new\_from\_syspath: device 0xd2fff8 has devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1'
udev\_device\_new\_from\_syspath: device 0xd30690 has devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2'
udev\_rules\_apply\_to\_event: RUN '/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: run: 'socket:@/org/freedesktop/hal/udev\_event'
udevadm\_test: run: '/usr/bin/numlockx off'

Das Problem ist, dass sich der NumLock-Status nicht ändert, wenn die Tastatur eingesteckt oder ausgesteckt wird. Ich habe versucht, den udev-Dienst neu zu starten, aber ohne Erfolg. Sind meine udev-Regeln falsch? Gehe ich die Sache falsch an?

1voto

Carl Smotricz Punkte 64366
  1. Ich kenne mich da nicht so gut aus, aber ich vermute, dass der Tastaturstatus von der X11-"Installation" verwaltet wird, die auf einer höheren Ebene als udev angesiedelt ist, so dass alles, was Sie dort unten tun, überschrieben wird. Vielleicht finden Sie mehr heraus, wenn Sie sich durch die Konfigurationsdateien in /etc/X11 .

  2. Möglicherweise erhalten Sie auf superuser.com (Link ganz unten auf dieser Seite) weitere relevante Antworten auf diese Frage. Ich werde nicht dafür stimmen, Ihre Frage hier zu schließen, aber andere könnten das tun.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X