
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.rules
in /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/test
não foi criado.
Acho que minha regra do udev deve corresponder à minha unidade USB, já que posso rodar udevadm info
na 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/device
e está claro que o .rules
arquivo 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/test
nã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 é RUN
executado?
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
RUN
comando devem ser absolutos - O arquivo deve ser executável
- O
PATH
ambiente é 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 PATH
ambiente 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 PATH
ambiente dentro do seu script.
Verifique qual caminho está definido registrando a set
saí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'