Das Skript in der udev-Regel wird nicht ausgeführt

10617
Eric Heikes

Ich verwende Ubuntu 9.10 (Karmic Koala) auf einem Laptop und möchte, dass NumLock automatisch umschaltet, je nachdem, ob meine USB-Tastatur angeschlossen (Numlock ein) oder nicht angeschlossen ist (Numlock aus).

Um dies zu erreichen, habe ich zuerst das Paket "numlockx" installiert. numlockx onund numlockx offfunktioniert gut.

Um mich in das Gerätesystem einzuhaken, dachte ich, ich würde udev verwenden. Ich habe "Udev-Regeln schreiben" gelesen, aber ich habe Schwierigkeiten, die Udev-Regel zum Laufen zu bringen.

Zunächst ein Beispiel für die dmesgAusgabe:

[20906.985102] usb 3-2: neues USB-Gerät mit niedriger Geschwindigkeit unter Verwendung von uhci_hcd und Adresse 6 [20907.166403] usb 3-2: Konfiguration Nr. 1 aus 1 Auswahl ausgewählt [20907.192904] Eingabe: Microsoft Natural® Ergonomic Keyboard 4000 als /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 Tastatur [Microsoft Natural® Ergonomic Keyboard 4000] unter usb-0000: 00: 1a.0-2 / input0 [20907.217810] Eingabe: Microsoft Natural® Ergonomic Keyboard 4000 als /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-Gerät [Microsoft Natural® Ergonomic Keyboard 4000] unter usb-0000: 00: 1a.0-2 / input1 

Ich habe udevadm infodie Geräteinformationen gesammelt:

> udevadm info -a -p /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21  Blick auf Gerät '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21': KERNEL == "input21" SUBSYSTEM == "Eingabe" FAHRER == "" ATTR == "usb-0000: 00: 1a.0-2 / input1" ATTR == "" ATTR == "Eingabe: 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, 17D, 17F 180,181,182,185,18C, 18D, 192,193,195,1A0,1A1,1A3,1A4,1A5,1A6,1A7,1A8,1A9,1AA, 1AB, 1AC, 1AD, 1AE, 1B0,1B1,1B7, r6, a20, m4, lsfw "  Blick auf das übergeordnete Gerät '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1': KERNELS == 3-2: 1.1 SUBSYSTEMS == "usb" FAHRER == "usbhid" ATTRS == "01" ATTRS == "0" ATTRS == "01" ATTRS == "03" ATTRS == "00" ATTRS == "00" ATTRS == "usb: v045Ep00DBd0173dc00dsc00dp00ic03isc00ip00" ATTRS == "1"  Blick auf das übergeordnete Gerät '/devices/pci0000:00/0000:00:1a.0/usb3/3-2': KERNELS == "3-2" SUBSYSTEMS == "usb" FAHRER == "usb" ATTRS == "" ATTRS == "2" ATTRS == "1" ATTRS == "a0" ATTRS == "100mA" ATTRS == "532" ATTRS == "045e" ATTRS == "00db" ATTRS == "0173" ATTRS == "00" ATTRS == "00" ATTRS == "00" ATTRS == "1" ATTRS == "8" ATTRS == "1,5" ATTRS == "3" ATTRS == "6" ATTRS == "2.00" ATTRS == "0" ATTRS == "0x0" ATTRS == "1" ATTRS == "Microsoft"  Blick auf das übergeordnete Gerät '/devices/pci0000:00/0000:00:1a.0/usb3': KERNELS == "usb3" SUBSYSTEMS == "usb" FAHRER == "usb" ATTRS == "" ATTRS == "1" ATTRS == "1" ATTRS == "e0" ATTRS == "0mA" ATTRS == "127" ATTRS == "1d6b" ATTRS == "0001" ATTRS == "0206" ATTRS == "09" ATTRS == "00" ATTRS == "00" ATTRS == "1" ATTRS == "64" ATTRS == "12" ATTRS == "3" ATTRS == "1" ATTRS == "1.10" ATTRS == "2" ATTRS == "0x0" ATTRS == "1" ATTRS == "Linux 2.6.31-16-generic uhci_hcd" ATTRS == "UHCI Host Controller" ATTRS == "0000: 00: 1a.0" ATTRS == "1"  Blick auf das übergeordnete Gerät '/devices/pci0000:00/0000:00:1a.0': KERNELS == "0000: 00: 1a.0" SUBSYSTEMS == "pci" FAHRER == "uhci_hcd" ATTRS == "0x8086" ATTRS == "0x2937" ATTRS == "0x1558" ATTRS == "0x0860" ATTRS == "0x0c0300" ATTRS == "16" ATTRS == "ff" ATTRS == "0-7" ATTRS == "pci: v00008086d00002937sv00001558sd00000860bc0Csc03i00" ATTRS == "0" ATTRS == ""  Blick auf das übergeordnete Gerät '/ devices / pci0000: 00': KERNELS == "pci0000: 00" SUBSYSTEMS == "" FAHRER == "" 

Also habe ich eine Datei mit dem Namen erstellt /etc/udev/rules.d/usb-keyboard.rules:

# Schalten Sie NumLock ein, wenn die Tastatur angeschlossen ist. ACTION == "Hinzufügen", ATTRS == "Microsoft", SUBSYSTEM == "Eingabe", RUN + = "/ usr / bin / numlockx on"  # Deaktivieren Sie NumLock, wenn die Tastatur nicht angeschlossen ist. ACTION == "remove", ATTRS == "Microsoft", SUBSYSTEM == "Eingabe", RUN + = "/ usr / bin / numlockx off" 

Ich habe mich udevadm testvergewissert, dass 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: aufruf: test udevadm_test: Version 147  [...] parse_file: Lesen von '/etc/udev/rules.d/usb-keyboard.rules' als Regeldatei udev_rules_new: Regeln verwenden 180864 Bytes Token (15072 * 12 Bytes) und 31614 Bytes Puffer udev_rules_new: temporärer Index verwendet 49760 Bytes (2488 * 20 Bytes) udev_device_new_from_syspath: Gerät 0x28d7d80 hat 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 ' /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: Gerät 0x28d8560 hat devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1' udev_device_new_from_syspath: Gerät 0x28d8708 hat devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2' udev_rules_apply_to_event: RUN '/ usr / bin / numlockx auf' /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: PRODUKT = 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 = Eingabe: b0003v045Ep00DBe0111-e0,1,2,3,4,14, k71,72,73,74,75,77,79,7A, 7B, 7C, 7D, 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 = Eingabe udevadm_test: run: '/ sbin / modprobe -b Eingabe: 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,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 ein' 

Und hier ist der "Entfernen" -Test:

> udevadm test --action = /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21 entfernen  run_command: aufruf: test udevadm_test: Version 147  [...] parse_file: Lesen von '/etc/udev/rules.d/usb-keyboard.rules' als Regeldatei udev_rules_new: Regeln verwenden 180864 Bytes Token (15072 * 12 Bytes) und 31614 Bytes Puffer udev_rules_new: temporärer Index verwendet 49760 Bytes (2488 * 20 Bytes) udev_device_new_from_syspath: Gerät 0xd2fd80 hat 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: Gerät 0xd2fff8 hat devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1' udev_device_new_from_syspath: Gerät 0xd30690 hat devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2' udev_rules_apply_to_event: RUN '/ usr / bin / numlockx' /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: PRODUKT = 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 = Eingabe: b0003v045Ep00DBe0111-e0,1,2,3,4,14, k71,72,73,74,75,77,79,7A, 7B, 7C, 7D, 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 = entfernen udevadm_test: SUBSYSTEM = Eingabe udevadm_test: run: 'socket: @ / org / freedesktop / hal / udev_event' udevadm_test: run: '/ usr / bin / numlockx off' 

Das Problem ist, dass der NumLock-Status nicht geändert wird, wenn die Tastatur angeschlossen oder entfernt wird. Ich habe versucht, den Udev-Dienst neu zu starten, ohne Glück. Sind meine udev-Regeln falsch? Mache ich das falsch?

8
Fest! Danke an Tony-P-Lee und Whitequark, die mich in die richtige Richtung weisen. Eric Heikes vor 14 Jahren 0

3 Antworten auf die Frage

4
tony-p-lee

Diese beiden Befehle können verwendet werden, um udev-Probleme häufig zu debuggen:

 udevd --debug-trace --verbose strace -p pid_of_udevd -f -e trace=open,exec 

Beachten Sie, dass sich args bei verschiedenen Versionen ändern kann ...

Ausgezeichneter Tipp - obwohl es keine "verbose" Option in meinem udevd gibt. "udevd --debug" war alles, was ich brauchte, um das Problem aufzuspüren. Eric Heikes vor 14 Jahren 3
@EricHeikes: Endlich ist es gelungen, einige nützliche Ausgaben zu erhalten, warum udev-Shell-Skripts nicht funktionieren. Vielen Dank! Mikko Ohtamaa vor 8 Jahren 0
4
whitequark

Das Problem ist, dass Sie Numlockx wahrscheinlich in einer X-Umgebung getestet haben (wie der Name schon sagt). X-Clients (GUI-Programme, die eine Verbindung zu einem X-Server herstellen, z. B. Firefox oder GEdit) müssen den Server kennen, zu dem eine Verbindung hergestellt werden soll, und sie müssen auch über eine Art Autorisierung verfügen. Versuchen Sie, sich über eine einfache Konsole anzumelden, egal ob von einem Benutzer mit Rootberechtigung oder einem einfachen Benutzer, und eine GUI-Anwendung zu starten: Einige DISPLAY-bezogene Fehler werden angezeigt, da sie es nicht wissen.

Um dies zu beheben, müssen Sie die Umgebungsvariable DISPLAY setzen. Wenn Sie nur einen X-Server haben, hat er fast immer die Adresse: 0.

Versuchen Sie dies bei normaler Konsole: Geben Sie ein numlockx on, und es wird "Fehler beim Öffnen der Anzeige!" Angezeigt. Typ DISPLAY=:0 numlockx on, und es wird funktionieren (zumindest für mich gearbeitet).

Sie können diese Umgebungsvariable also in udev setzen oder einfach starten sh -c 'DISPLAY=:0 numlockx <state>'.

Du hast recht! Ich hatte nicht gedacht, dass Numlockx eine X-Umgebung erfordert. Obwohl die Einstellung von DISPLAY die Fehlermeldung beseitigt, funktioniert sie leider nicht - entweder in der Konsole oder über udev. Eric Heikes vor 14 Jahren 0
Zu früh gesprochen Es funktioniert, wenn Sie die Shell mit dem vollständigen Pfad ausführen: `/ bin / sh -c '...'` Eric Heikes vor 14 Jahren 0
0
Blorgbeard

Es könnte ein reiner Zufall sein, aber meine udev-Regel begann zu funktionieren, als ich sie mit einer Zahl benannte, z. 80-usb-keyboard.rules.

Ich hatte das auch überlegt, aber es macht keinen Unterschied. Eric Heikes vor 14 Jahren 0