O script na regra do udev não é executado

8

Estou executando o Ubuntu 9.10 (Karmic Koala) em um laptop e gostaria que o NumLock alternasse automaticamente, dependendo se meu teclado USB está conectado (numlock ativado) ou desconectado (desativado).

Para fazer isso, instalei o pacote "numlockx" pela primeira vez. numlockx one numlockx offfunciona bem.

Para conectar-se ao sistema do dispositivo, pensei em usar o udev. Eu li "Escrevendo regras do udev" , mas estou tendo problemas para que a regra do udev funcione.

Primeiro, aqui está um exemplo da dmesgsaída:

[20906.985102] usb 3-2: novo dispositivo USB de baixa velocidade usando uhci_hcd e endereço 6
[20907.166403] usb 3-2: configuração nº 1 escolhida entre 1 opção
[20907.192904] entrada: Microsoft Natural® Ergonomic Keyboard 4000 como /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.0/input/input20
[20907.193100] microsoft 0003: 045E: 00DB.000B: entrada, hidraw1: teclado USB HID v1.11 [Microsoft Natural® Ergonomic Keyboard 4000] em usb-0000: 00: 1a.0-2 / input0
[20907.217810] entrada: Microsoft Natural® Ergonomic Keyboard 4000 como /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21
[20907.217979] microsoft 0003: 045E: 00DB.000C: entrada, hidraw2: dispositivo USB HID v1.11 [Microsoft Natural® Ergonomic Keyboard 4000] em usb-0000: 00: 1a.0-2 / input1

Eu costumava udevadm inforeunir as informações do dispositivo:

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

  olhando para o dispositivo '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21':
    KERNEL == "input21"
    SUBSISTEMA == "entrada"
    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 "

  olhando para o dispositivo pai '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1':
    KERNELS == "3-2: 1.1"
    SUBSISTEMS == "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"

  olhando para o dispositivo pai '/devices/pci0000:00/0000:00:1a.0/usb3/3-2':
    KERNELS == "3-2"
    SUBSISTEMS == "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 {peculiaridades} == "0x0"
    ATTRS {autorizado} == "1"
    ATTRS {fabricante} == "Microsoft"

  olhando para o dispositivo pai '/devices/pci0000:00/0000:00:1a.0/usb3':
    KERNELS == "usb3"
    SUBSISTEMS == "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 {peculiaridades} == "0x0"
    ATTRS {autorizado} == "1"
    ATTRS {manufacturer} == "Linux 2.6.31-16-generic uhci_hcd"
    ATTRS {product} == "Controlador de host UHCI"
    ATTRS {serial} == "0000: 00: 1a.0"
    ATTRS {default_default} == "1"

  olhando para o dispositivo pai '/devices/pci0000:00/0000:00:1a.0':
    KERNELS == "0000: 00: 1a.0"
    SUBSISTEMS == "pci"
    DRIVERS == "uhci_hcd"
    ATTRS {vendedor} == "0x8086"
    ATTRS {dispositivo} == "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} == ""

  olhando para o dispositivo pai '/ devices / pci0000: 00':
    KERNELS == "pci0000: 00"
    SUBSISTEMAS == ""
    DRIVERS == ""

Então, eu criei um arquivo chamado /etc/udev/rules.d/usb-keyboard.rules:

# Ligue o NumLock quando o teclado estiver conectado.
AÇÃO == "adicionar", ATTRS {fabricante} == "Microsoft", SUBSISTEMA == "entrada", EXECUÇÃO + = "/ usr / bin / numlockx em"

# Desative o NumLock quando o teclado estiver desconectado.
AÇÃO == "remover", ATTRS {fabricante} == "Microsoft", SUBSISTEMA == "entrada", EXECUÇÃO + = "/ usr / bin / numlockx desativado"

Eu usei udevadm testpara verificar se as regras estão corretas:

> udevadm test --action = add /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21
run_command: chamando: test
udevadm_test: versão 147

[...]
parse_file: lendo '/etc/udev/rules.d/usb-keyboard.rules' como arquivo de regras
udev_rules_new: as regras usam tokens de 180864 bytes (15072 * 12 bytes), buffer de 31614 bytes
udev_rules_new: índice temporário usado 49760 bytes (2488 * 20 bytes)
udev_device_new_from_syspath: o dispositivo 0x28d7d80 possui devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21'
udev_rules_apply_to_event: EXECUTAR '/ sbin / modprobe -b $ env {MODALIAS}' /lib/udev/rules.d/80-drivers.rules:5
udev_rules_apply_to_event: soquete RUN ': @ / org / freedesktop / hal / udev_event' /lib/udev/rules.d/90-hal.rules:2
udev_device_new_from_syspath: o dispositivo 0x28d8560 possui o devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1'
udev_device_new_from_syspath: o dispositivo 0x28d8708 possui o devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2'
udev_rules_apply_to_event: EXECUTAR '/ usr / bin / numlockx em' /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 = "Teclado Ergonômico Microsoft Natural® 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 = entrada
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'

E aqui está o teste "remover":

> udevadm test --action = remove /devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21

run_command: chamando: test
udevadm_test: versão 147

[...]
parse_file: lendo '/etc/udev/rules.d/usb-keyboard.rules' como arquivo de regras
udev_rules_new: as regras usam tokens de 180864 bytes (15072 * 12 bytes), buffer de 31614 bytes
udev_rules_new: índice temporário usado 49760 bytes (2488 * 20 bytes)
udev_device_new_from_syspath: o dispositivo 0xd2fd80 possui o devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1/input/input21'
udev_rules_apply_to_event: soquete RUN ': @ / org / freedesktop / hal / udev_event' /lib/udev/rules.d/90-hal.rules:2
udev_device_new_from_syspath: o dispositivo 0xd2fff8 possui devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2/3-2:1.1'
udev_device_new_from_syspath: o dispositivo 0xd30690 possui o devpath '/devices/pci0000:00/0000:00:1a.0/usb3/3-2'
udev_rules_apply_to_event: EXECUTAR '/ 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 = "Teclado Ergonômico Microsoft Natural® 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 = remover
udevadm_test: SUBSYSTEM = entrada
udevadm_test: run: 'socket: @ / org / freedesktop / hal / udev_event'
udevadm_test: run: '/ usr / bin / numlockx off'

O problema é que, quando o teclado é conectado ou desconectado, o status do NumLock não muda. Eu tentei reiniciar o serviço udev, sem sorte. Minhas regras do udev estão erradas? Estou fazendo isso da maneira errada?

Eric Heikes
fonte
Fixo! Agradeço a tony-p-lee e whitequark por me apontarem na direção certa.
Eric Heikes

Respostas:

5

O problema é que você provavelmente testou o numlockx em (como o nome sugere) em algum ambiente X. Os clientes X (programas GUI que se conectam ao servidor X, por exemplo, Firefox ou GEdit) precisam conhecer o servidor ao qual se conectar e também devem passar algum tipo de autorização. Tente fazer login no console simples, não importa o usuário root ou simples, e inicie um aplicativo da GUI: ele mostrará alguns erros relacionados ao DISPLAY, porque não sabe.

Para corrigir isso, você precisa definir a variável de ambiente DISPLAY; se você tiver apenas um servidor X, ele quase sempre terá o endereço: 0.

Tente isso no console simples: digite numlockx one ele mostrará "Erro ao abrir a tela!". Digite DISPLAY=:0 numlockx one funcionará (funcionou para mim pelo menos).

Portanto, você pode definir essa variável de ambiente no udev ou apenas iniciar sh -c 'DISPLAY=:0 numlockx <state>'.

whitequark
fonte
Você está certo! Eu não tinha considerado que o numlockx requer um ambiente X. Infelizmente, embora a configuração do DISPLAY elimine a mensagem de erro, ela não funciona - no console ou no udev.
Eric Heikes
Falou muito cedo. Funciona se você executar o shell usando o caminho completo:/bin/sh -c '...'
Eric Heikes
4

esses dois comandos podem ser usados ​​para depurar muitos problemas do udev:

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

Observe que os argumentos podem mudar em versões diferentes ...

tony-p-lee
fonte
3
Dica excelente - embora não haja opção "detalhada" no meu udevd. udevd --debugera tudo o que eu precisava para rastrear o problema.
Eric Heikes
@ EricHeikes: Finalmente consegui obter uma saída útil porque os scripts de shell do udev não funcionam. Obrigado!
Mikko Ohtamaa 31/03
0

Pode ser pura coincidência, mas minha regra do udev começou a funcionar quando o nomeei, começando com um número, por exemplo. 80-usb-keyboard.rules.

Blorgbeard está fora
fonte
Eu tinha considerado isso também, mas não faz nenhuma diferença.
Eric Heikes