Estou tentando configurar um script para ser executado sempre que conectar um dispositivo USB. Criei o arquivo /etc/udev/rules.d/90-local.rules e adicionei a seguinte regra:
ACTION=="add", SUBSYSTEM=="usb", KERNEL=="sd*", SYSFS{model}=="Cruzer*", RUN+="sh /home/jesse/Documents/Scripts/cruzer.sh"
O problema é que, quando a unidade está conectada, nada acontece. O script, para fins de depuração, é projetado para enviar uma notificação com o notify-send, que está instalado e funciona bem no terminal.
O caminho para o script está correto, pois executei o comando exato no terminal sem problemas.
Respostas:
Eu tive o mesmo problema. Isso funcionou para mim:
Tente copiar seu script
/usr/local/bin
e alterar o diretório em seu.rules
arquivo.Além disso, não sei o que é SYSFS, mas eu preferiria usar as propriedades ATTR.
A seguinte linha é o conteúdo do meu
.rules
arquivo:fonte
ATTRS{vendor}=="SanDisk "
parte isso significa que apenasSandisk
será detectado?notify-send
requer acesso ao seu barramento de sessão DBus, que não pode ter por dois motivos:Nenhuma informação sobre a sessão. Quando iniciado pelo udev, seu script não sabe nada sobre onde você está conectado ou se está conectado. Multi-assento com o X11 ainda é complicado, mas a troca de usuário funciona para as sessões do X11 e do console. Muitas pessoas também usam SSH, VNC e NX na rede.
(
DISPLAY=:0
Iria trabalhar metade do tempo, mas que ainda está supondo que na melhor das hipóteses).Negado pela política DBus. Mesmo que seu script encontre sua sessão X11 de alguma forma, ele não poderá enviar notificações devido à execução do script como em
root
vez da sua conta de usuário.fonte
for LINE in $(find /proc/ -maxdepth 2 -name environ -exec grep -z "^DBUS_SESSION_BUS_ADDRESS" {} \; | sort -uz | tr '\0' '\n'); do eval $LINE ... done;
fez o truque para mim com notificar-sendVocê pode tentar corresponder o dispositivo por IDs de fornecedor e produto. A seguinte regra personalizada funciona para mim:
Você pode ver idVendor e idProduct na saída lsusb ou dmesg após conectar o dispositivo.
fonte
Seguindo a resposta de Aleh: Se você também deseja monitorar
remove
eventos, precisa procurar uma variável de ambiente chamadaID_SERIAL
. Ele contém o fornecedor e o ID do produto separados por sublinhado:A regra agora é mais curta também.
fonte
Talvez você precise adicionar um
sleep
no script, para dar ao dispositivo USB a chance de "se acalmar"? Por exemplo, modems usb 3G, alternância de modo para obter um / dev / ttyUSB para ser iniciado e executado pelo kernel.fonte
Tente substituir SUBSYSTEM = "usb" por SUBSYSTEMS = "usb"
fonte
SUBSYSTEM=="usb"
está tudo bem.