Quero executar um script quando conectar um dispositivo na minha máquina Linux. Por exemplo, execute xinput
no mouse ou em um backupscript em uma determinada unidade.
Eu já vi muitos artigos sobre isso, mais recentemente aqui e aqui . Mas eu simplesmente não consigo fazê-lo funcionar.
Aqui estão alguns exemplos simples tentando obter pelo menos algum tipo de resposta.
/etc/udev/rules.d/test.rules
#KERNEL=="sd*", ATTRS{vendor}=="*", ATTRS{model}=="*", ATTRS{serial}=="*", RUN+="/usr/local/bin/test.sh"
#KERNEL=="sd*", ACTION=="add", "SUBSYSTEM=="usb", ATTRS{model}=="My Book 1140 ", ATTRS{serial}=="0841752394756103457194857249", RUN+="/usr/local/bin/test.sh"
#ACTION=="add", "SUBSYSTEM=="usb", RUN+="/usr/local/bin/test.sh"
#KERNEL=="sd*", ACTION=={add}, RUN+="/usr/local/bin/test.sh"
KERNEL=="sd*", RUN+="/usr/local/bin/test.sh"
KERNEL=="*", RUN+="/usr/local/bin/test.sh"
/usr/local/bin/test.sh
#!/usr/bin/env bash
echo touched >> /var/log/test.log
if [ "${ACTION}" = "add" ] && [ -f "${DEVICE}" ]
then
echo ${DEVICE} >> /var/log/test.log
fi
A pasta de regras é monitorada inotify
e deve estar ativa imediatamente. Eu continuo recarregando meu teclado, mouse, tablet, cartão de memória e drive USB, mas nada. Nenhum arquivo de log foi tocado.
Agora, qual seria a maneira mais simples de pelo menos saber que algo está funcionando? É mais fácil trabalhar com algo que está funcionando do que com algo que não está.
udevadm trigger
ou conectou um dispositivo para aplicar a nova regra?3.5.0-23-generic
.Respostas:
Se você deseja executar o script em um dispositivo específico, pode usar os IDs do fornecedor e do produto
Em
/etc/udev/rules.d/test.rules
:em
test.sh
:Com
env
, você pode ver qual ambiente está definido no udev e comfile
, descobrirá o tipo de arquivo.Os atributos concretos do seu dispositivo podem ser descobertos com
lsusb
dá
fonte
ACTION=="add",
diretamente à definição de regra.Não se trata diretamente da sua pergunta, mas do que você está fazendo. Se você iniciar um script de backup no udev, enfrentará dois problemas principais:
Meu conselho é criar um script em sua página inicial do usuário que ouça um pipe nomeado e que seja iniciado de forma assíncrona como:
Nota: Eu uso a montagem automática com o kde, para verificar se a pasta aparece. Você pode passar o parâmetro / dev / sd * no fifo da regra udev e montá-lo você mesmo no script. Para escrever no fifo, não esqueça que o udev não é um shell e que o redirecionamento não funciona. Seu RUN deve ser como:
RUN + = "/ bin / sh -c '/ bin / eco conectado >> / tmp / IomegaUsbPipe'"
fonte
Publiquei uma solução em /ubuntu//a/516336 e também estou copiando e colando a solução aqui.
Eu escrevi um script Python usando pyudev que deixo sendo executado em segundo plano. Esse script ouve eventos do udev (portanto, é muito eficiente) e executa o código que eu quiser. No meu caso, ele executa
xinput
comandos para configurar meus dispositivos ( link para a versão mais recente ).Aqui está uma versão curta do mesmo script:
fonte
call()
. Dessa forma, se for necessário fornecer argumentos para ofoobar.sh
script, você poderá fazer isso dinamicamente.Para executar o script na inicialização quando o dispositivo USB é inserido, eu uso a solução abaixo:
Formate o pendrive ou qualquer outro armazenamento USB e atribua um nome ao fazê-lo. Em seguida,
/etc/rc.local
adicione linhals -q /dev/disk/by-label > /home/pi/label.txt
ele criará um arquivo txt chamado label.txt (pode ser qualquer outro nome)
depois, em /etc/rc.local, adicione outras 2 linhas:
Agora, sempre que o pendrive com o nome USB_drive_name for inserido, ele executará o script.
Com algumas pequenas modificações acima, a solução pode ser usada quando o sistema estiver em funcionamento.
fonte
udev
para outros momentos não são "algumas pequenas modificações") e o Raspberry Pi. Há um desnecessáriosudo
-rc.local
é executado como root, é um problema de escalonamento de privilégios - um arquivo que é editável por um usuário normal é executado como root.