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

8

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 on) oder nicht angeschlossen (numlock off) ist.

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

Um mich an das Gerätesystem anzuschließen, dachte ich, ich würde udev verwenden. Ich habe "Schreiben von udev-Regeln" gelesen , aber ich habe Probleme, die udev-Regel zum Laufen zu bringen.

Hier ist 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: Eingabe, Hidraw1: USB HID v1.11-Tastatur [Microsoft Natural® Ergonomic Keyboard 4000] auf USB-0000: 00: 1a.0-2 / Eingabe0
[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: Eingabe, Hidraw2: USB HID v1.11-Gerät [Microsoft Natural® Ergonomic Keyboard 4000] auf USB-0000: 00: 1a.0-2 / Eingabe1

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

  Betrachten des Geräts '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21':
    KERNEL == "input21"
    SUBSYSTEM == "Eingabe"
    DRIVER == ""
    ATTR {phys} == "usb-0000: 00: 1a.0-2 / input1"
    ATTR {uniq} == ""
    ATTR {modalias} == "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,1A2,1A3,1A4,1A5,1A6,1A7,1A8,1A9,1AA, 1AB, 1AC, 1AD, 1AE, 1B0,1B1,1B7, r6, a20, m4 , lsfw "

  Betrachten des übergeordneten Geräts '/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 {support_autosuspend} == "1"

  Betrachten des übergeordneten Geräts '/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 {Geschwindigkeit} == "1,5"
    ATTRS {busnum} == "3"
    ATTRS {devnum} == "6"
    ATTRS {version} == "2.00"
    ATTRS {maxchild} == "0"
    ATTRS {Macken} == "0x0"
    ATTRS {autorisiert} == "1"
    ATTRS {Hersteller} == "Microsoft"

  Betrachten des übergeordneten Geräts '/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 {Geschwindigkeit} == "12"
    ATTRS {busnum} == "3"
    ATTRS {devnum} == "1"
    ATTRS {version} == "1.10"
    ATTRS {maxchild} == "2"
    ATTRS {Macken} == "0x0"
    ATTRS {autorisiert} == "1"
    ATTRS {Hersteller} == "Linux 2.6.31-16-generic uhci_hcd"
    ATTRS {product} == "UHCI Host Controller"
    ATTRS {serial} == "0000: 00: 1a.0"
    ATTRS {autorisierter_Default} == "1"

  Betrachten des übergeordneten Geräts '/devices/pci0000:00/0000:00:1a.0':
    KERNELS == 0000: 00: 1a.0
    SUBSYSTEMS == "pci"
    DRIVERS == "uhci_hcd"
    ATTRS {vendor} == "0x8086"
    ATTRS {Gerät} == "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 {gebrochener_Paritätsstatus} == "0"
    ATTRS {msi_bus} == ""

  Betrachten des übergeordneten Geräts '/ Geräte / pci0000: 00':
    KERNELS == "pci0000: 00"
    SUBSYSTEMS == ""
    DRIVERS == ""

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

# Schalten Sie NumLock ein, wenn die Tastatur angeschlossen ist.
ACTION == "add", ATTRS {Hersteller} == "Microsoft", SUBSYSTEM == "input", RUN + = "/ usr / bin / numlockx on"

# Schalten Sie NumLock aus, wenn die Tastatur nicht angeschlossen ist.
ACTION == "remove", ATTRS {Hersteller} == "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: 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-Byte-Token (15072 * 12 Byte), 31614-Byte-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 {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: 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 den 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 = / device / 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 = 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,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,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: 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-Byte-Token (15072 * 12 Byte), 31614-Byte-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 den 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 = / device / 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 = 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,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 sich der NumLock-Status nicht ändert, wenn die Tastatur ein- oder ausgesteckt ist. Ich habe versucht, den udev-Dienst ohne Glück neu zu starten. Sind meine udev-Regeln falsch? Gehe ich falsch vor?

Eric Heikes
quelle
Fest! Vielen Dank an Tony-P-Lee und Whitequark, die mich in die richtige Richtung gelenkt haben.
Eric Heikes

Antworten:

5

Das Problem ist, dass Sie wahrscheinlich numlockx in einer X-Umgebung getestet haben (wie der Name schon sagt). X-Clients (GUI-Programme, die eine Verbindung zum X-Server herstellen, z. B. Firefox oder GEdit) müssen den Server kennen, zu dem eine Verbindung hergestellt werden soll, und eine Berechtigung übergeben. Versuchen Sie, sich von der einfachen Konsole aus anzumelden, unabhängig davon, ob es sich um einen Root- oder einen einfachen Benutzer handelt, und starten Sie eine GUI-Anwendung: Es werden einige DISPLAY-bezogene Fehler angezeigt, da dies nicht bekannt ist.

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

Versuchen Sie dies an der einfachen Konsole: Geben Sie ein numlockx onund es wird "Fehler beim Öffnen der Anzeige!" Angezeigt. Tippe DISPLAY=:0 numlockx on, und es wird funktionieren (hat zumindest für mich funktioniert).

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

Whitequark
quelle
Du hast recht! Ich hatte nicht gedacht, dass numlockx eine X-Umgebung erfordert. Obwohl das Festlegen des DISPLAY die Fehlermeldung beseitigt, funktioniert es leider nicht - weder in der Konsole noch über udev.
Eric Heikes
Sprach zu früh. Es funktioniert, wenn Sie die Shell mit dem vollständigen Pfad ausführen:/bin/sh -c '...'
Eric Heikes
4

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 die Argumente in verschiedenen Versionen ändern können ...

Tony-P-Lee
quelle
3
Ausgezeichneter Tipp - obwohl es auf meinem udevd keine "ausführliche" Option gibt. udevd --debugwar alles, was ich brauchte, um das Problem aufzuspüren.
Eric Heikes
@EricHeikes: Endlich ist es gelungen, eine nützliche Ausgabe zu erhalten, warum udev-Shell-Skripte nicht funktionieren. Vielen Dank!
Mikko Ohtamaa
0

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

Blorgbeard ist raus
quelle
Ich hatte das auch in Betracht gezogen, aber es macht keinen Unterschied.
Eric Heikes