regra udev para conexão/desconexão USB não acionada

regra udev para conexão/desconexão USB não acionada

Estou executando o RHEL6 e tentando escrever uma regra do udev que é acionada ao conectar e remover dispositivos USB. Criei um arquivo chamado 80-usb.rulesin /etc/udev/rules.d/e dei a ele o seguinte conteúdo (até agora nada muito específico, só quero testar):

ACTION=="add", SUBSYSTEMS=="usb", RUN+="touch /tmp/test"

Salvei o arquivo e conectei uma unidade USB para testar. No entanto, o arquivo /tmp/testnão foi criado.

Acho que minha regra do udev deve corresponder à minha unidade USB, já que posso rodar udevadm infona unidade USB e pelo menos um dos dispositivos pai possui o atributo SUBSYSTEMS=="usb".

Por que a regra do udev não foi acionada?

Tentei executar udevadm test --action=add /path/to/devicee está claro que o .rulesarquivo que escrevi está sendo processado e que minhas regras estão sendo correspondidas. Aqui estão algumas linhas relevantes da saída:

parse_file: reading '/etc/udev/rules.d/80-usb.rules' as rules file
udev_rules_apply_to_event: RUN '/bin/touch /tmp/test' /etc/udev/rules.d/80-usb.rules:1
udevadm_test: run: '/bin/touch /tmp/test'

Mas ainda assim, /tmp/testnão existe. Estou tão confuso. É evidente que esta regra está a ser cumprida e as regras estão a ser aplicadas. Então, por que o comando especificado por não é RUNexecutado?

Responder1

Sua regra deve fornecer um caminho absoluto para o executável:

ACTION=="add", SUBSYSTEMS=="usb", RUN+="/usr/bin/touch /tmp/test"

Editar:

E se você quiser executar um script, você deve informar qual shell irá executá-lo:

ACTION=="add", SUBSYSTEMS=="usb", RUN+="/bin/sh /path/to/your/script"

Responder2

Você deve garantir o seguinte:

  • Os caminhos no RUNcomando devem ser absolutos
  • O arquivo deve ser executável
  • O PATHambiente é limitado na execução do seu comando

Primeiro adicione este arquivo de script ao/lib/udev/touch.sh

vim /lib/udev/touch.sh

nesse arquivo escreva:

#!/bin/bash
touch /tmp/test

torne-o executável:

chmod +x /lib/udev/touch.sh

e altere seu arquivo de regras para:

ACTION=="add", SUBSYSTEMS=="usb", RUN+="/lib/udev/touch.sh"

recarregue suas regras do udev

udevadm control --reload-rules

Isso lerá suas regras /lib/udev/rules.d/*novamente. As alterações não serão aplicadas até agora.

Observe que o udev executa seu script em um PATHambiente reduzido. Você deve garantir que qualquer binário que não esteja nos caminhos configurados seja acessado com um caminho completo. Você também pode estender o PATHambiente dentro do seu script.

Verifique qual caminho está definido registrando a setsaída em um arquivo de log do seu script wrapper:

set >>/tmp/udev-env-test

Pode ser assim:

PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'

informação relacionada