Lo script nella regola udev non viene eseguito


8

Sto eseguendo Ubuntu 9.10 (Karmic Koala) su un laptop e vorrei che NumLock si attivasse automaticamente a seconda che la mia tastiera USB sia collegata (blocco numerico attivo) o scollegata (blocco numerico spento).

Per fare ciò, ho prima installato il pacchetto "numlockx". numlockx one numlockx offfunziona benissimo.

Per collegarmi al sistema del dispositivo, ho pensato di usare udev. Ho letto "Scrivere regole udev" , ma ho problemi a far funzionare la regola udev.

Innanzitutto, ecco un esempio dmesgdell'output:

[20906.985102] usb 3-2: nuovo dispositivo USB a bassa velocità con uhci_hcd e indirizzo 6
[20907.166403] usb 3-2: configurazione n. 1 scelta da 1 scelta
[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: tastiera USB HID v1.11 [Microsoft Natural® Ergonomic Keyboard 4000] su 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: dispositivo USB HID v1.11 [Microsoft Natural® Ergonomic Keyboard 4000] su usb-0000: 00: 1a.0-2 / input1

Ho usato udevadm infoper raccogliere le informazioni sul dispositivo:

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

  guardando il dispositivo '/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"

  guardando il dispositivo genitore '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1':
    NOCCIOLI == "3-2: 1.1"
    SOTTOSISTEMI == "usb"
    DRIVER == "USBHID"
    ATTR {} bInterfaceNumber == "01"
    ATTRS {bAlternateSetting} == "0"
    ATTR {bNumEndpoints} == "01"
    ATTR {} bInterfaceClass == "03"
    ATTR {} bInterfaceSubClass == "00"
    ATTR {} bInterfaceProtocol == "00"
    ATTR {modalias} == "usb: v045Ep00DBd0173dc00dsc00dp00ic03isc00ip00"
    ATTR {} supports_autosuspend == "1"

  guardando il dispositivo genitore '/devices/pci0000:00/0000:00:1a.0/usb3/3-2':
    NOCCIOLI == "3-2"
    SOTTOSISTEMI == "usb"
    DRIVER == "usb"
    ATTR {configurazione} == ""
    ATTRS {bNumInterfaces} == "2"
    ATTR {} bConfigurationValue == "1"
    Attrs {bmAttributes} == "a0"
    ATTR {} bMaxPower == "100mA"
    ATTR {} urbnum == "532"
    ATTR {} idVendor == "045e"
    ATTR {} idProduct == "00db"
    ATTR {} bcdDevice == "0173"
    ATTR {} bDeviceClass == "00"
    ATTR {} bDeviceSubClass == "00"
    ATTR {} bDeviceProtocol == "00"
    ATTR {bNumConfigurations} == "1"
    ATTR {} bMaxPacketSize0 == "8"
    ATTR {Velocità} == "1.5"
    ATTR {} BusNum == "3"
    ATTR {} devnum == "6"
    ATTRS {versione} == "2.00"
    ATTR {} maxchild == "0"
    Attrs {} == stranezze "0x0"
    ATTR {autorizzato} == "1"
    ATTR {produttore} == "Microsoft"

  guardando il dispositivo genitore '/devices/pci0000:00/0000:00:1a.0/usb3':
    NOCCIOLI == "USB3"
    SOTTOSISTEMI == "usb"
    DRIVER == "usb"
    ATTR {configurazione} == ""
    ATTRS {bNumInterfaces} == "1"
    ATTR {} bConfigurationValue == "1"
    Attrs {bmAttributes} == "E0"
    ATTRS {bMaxPower} == "0mA"
    ATTR {} urbnum == "127"
    ATTR {} idVendor == "1d6b"
    ATTR {} idProduct == "0001"
    ATTR {} bcdDevice == "0206"
    ATTR {} bDeviceClass == "09"
    ATTR {} bDeviceSubClass == "00"
    ATTR {} bDeviceProtocol == "00"
    ATTR {bNumConfigurations} == "1"
    ATTR {} bMaxPacketSize0 == "64"
    ATTR {Velocità} == "12"
    ATTR {} BusNum == "3"
    ATTR {} devnum == "1"
    ATTRS {versione} == "1.10"
    ATTR {} maxchild == "2"
    Attrs {} == stranezze "0x0"
    ATTR {autorizzato} == "1"
    ATTRS {producer} == "Linux 2.6.31-16-generic uhci_hcd"
    ATTRS {product} == "Controller host UHCI"
    ATTR {serial} == "0000: 00: 1a.0"
    ATTR {} authorized_default == "1"

  guardando il dispositivo genitore '/devices/pci0000:00/0000:00:1a.0':
    NOCCIOLI == "0000: 00: 1a.0"
    SOTTOSISTEMI == "pci"
    DRIVER == "uhci_hcd"
    ATTR {vendor} == "0x8086"
    ATTR {dispositivo} == "0x2937"
    ATTR {} subsystem_vendor == "0x1558"
    ATTR {} subsystem_device == "0x0860"
    ATTR {class} == "0x0c0300"
    ATTR {} IRQ == "16"
    Attrs {local_cpus} == "FF"
    ATTR {} local_cpulist == "0-7"
    ATTR {modalias} == "PCI: v00008086d00002937sv00001558sd00000860bc0Csc03i00"
    ATTR {} broken_parity_status == "0"
    ATTR {} msi_bus == ""

  guardando il dispositivo genitore '/ devices / pci0000: 00':
    NOCCIOLI == "pci0000: 00"
    SOTTOSISTEMI == ""
    DRIVERS == ""

Quindi ho creato un file chiamato /etc/udev/rules.d/usb-keyboard.rules:

# Attiva NumLock quando la tastiera è collegata.
AZIONE == "aggiungi", ATTRS {produttore} == "Microsoft", SOTTOSISTEMA == "input", RUN + = "/ usr / bin / numlockx on"

# Disattiva NumLock quando la tastiera è scollegata.
AZIONE == "rimuovi", ATTRS {produttore} == "Microsoft", SUBSYSTEM == "input", RUN + = "/ usr / bin / numlockx off"

Ho usato udevadm testper verificare che le regole siano corrette:

> udevadm test --action = aggiungi /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21
run_command: calling: test
udevadm_test: versione 147

[...]
parse_file: lettura '/etc/udev/rules.d/usb-keyboard.rules' come file delle regole
udev_rules_new: le regole utilizzano token token 180864 (15072 * 12 byte), buffer 31614 byte
udev_rules_new: indice temporaneo utilizzato 49760 byte (2488 * 20 byte)
udev_device_new_from_syspath: il dispositivo 0x28d7d80 ha 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: il dispositivo 0x28d8560 ha devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1'
udev_device_new_from_syspath: il dispositivo 0x28d8708 ha devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2'
udev_rules_apply_to_event: RUN '/ usr / bin / numlockx su' /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'

Ed ecco il test "rimuovi":

> 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: versione 147

[...]
parse_file: lettura '/etc/udev/rules.d/usb-keyboard.rules' come file delle regole
udev_rules_new: le regole utilizzano token token 180864 (15072 * 12 byte), buffer 31614 byte
udev_rules_new: indice temporaneo utilizzato 49760 byte (2488 * 20 byte)
udev_device_new_from_syspath: il dispositivo 0xd2fd80 ha 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: il dispositivo 0xd2fff8 ha devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1'
udev_device_new_from_syspath: il dispositivo 0xd30690 ha 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 = rimuovi
udevadm_test: SUBSYSTEM = input
udevadm_test: run: 'socket: @ / org / freedesktop / hal / udev_event'
udevadm_test: run: '/ usr / bin / numlockx off'

Il problema è che quando la tastiera è collegata o scollegata, lo stato di NumLock non cambia. Ho provato a riavviare il servizio udev, senza fortuna. Le mie regole udev sono sbagliate? Sto andando in questo modo nel modo sbagliato?


Fisso! Grazie a tony-p-lee e whitequark per avermi indicato nella giusta direzione.
Eric Heikes,

Risposte:


5

Il problema è che probabilmente hai provato numlockx in (come suggerisce il nome) in un ambiente X. I client X (programmi GUI che si connettono al server X, ad esempio Firefox o GEdit) devono conoscere il server a cui connettersi e devono anche passare un qualche tipo di autorizzazione. Prova ad accedere dalla console semplice, non importa da root o utente normale, e avvia un'applicazione GUI: mostrerà alcuni errori relativi al DISPLAY perché non lo sa.

Per risolvere questo problema è necessario impostare la variabile di ambiente DISPLAY; se hai un solo server X ha quasi sempre l'indirizzo: 0.

Prova questo su console semplice: digita numlockx on, e mostrerà "Errore durante l'apertura del display!". Digita DISPLAY=:0 numlockx one funzionerà (almeno ha funzionato per me).

Quindi puoi impostare questa variabile d'ambiente in udev o semplicemente lanciarla sh -c 'DISPLAY=:0 numlockx <state>'.


Hai ragione! Non avevo considerato che numlockx richiedesse un ambiente X. Sfortunatamente, sebbene l'impostazione di DISPLAY elimini il messaggio di errore, non funziona, né nella console né tramite udev.
Eric Heikes,

Ho parlato troppo presto. Funziona se esegui la shell usando il percorso completo:/bin/sh -c '...'
Eric Heikes,

4

questi due comandi possono essere utilizzati per eseguire il debug di problemi udev molto:

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

Nota che args potrebbe cambiare su una versione diversa ...


3
Consiglio eccellente - anche se sul mio udevd non esiste un'opzione "dettagliata". udevd --debugera tutto ciò di cui avevo bisogno per rintracciare il problema.
Eric Heikes,

@EricHeikes: Finalmente sono riuscito a ottenere un risultato utile perché gli script della shell udev non funzionano. Grazie!
Mikko Ohtamaa,

0

Potrebbe essere una pura coincidenza, ma la mia regola udev ha iniziato a funzionare quando l'ho chiamata a partire da un numero, ad es. 80-usb-keyboard.rules.


Lo avevo considerato anche io, ma non fa alcuna differenza.
Eric Heikes,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.