No Ubuntu 12.04, minha regra dispara um script chamado motoe.sh
quando um Motorola Moto E está conectado à porta USB da máquina. Minha regra personalizada não funciona.
A regra é:
ACTION=="add", SUBSYSTEMS=="usb", ATTRS{idVendor}=="22b8", ATTRS{idProduct}=="2e76", RUN+="/usr/local/bin/motoe.sh"
motoe.sh
é:
#!/bin/bash
motoemount.sh & motoedesktop.sh
motoemount.sh
é:
#!/bin/bash
go-mtpfs /media/MyAndroid
motoedesktop.sh
é:
#!/bin/bash
gmessage -center -timeout 3 -buttons OK:0 "message to "
rdesktop -u username -d domain -r disk:motoe=/media/MyAndroid/Interno/Download ip_address -a 8 -k pt-br
gmessage -center -timeout 3 -buttons OK:0 "another message to the user" &
umount /media/MyAndroid/
Todos os scripts .sh têm permissão de execução definida.
Tentei usar SUBSYSTEM, SUBSYSTEMS, com DRIVER sem DRIVER, e sem efeito.
Não entendo o que perdi. Se eu executar motoe.sh
a partir de um terminal, ele será executado corretamente.
Responder1
-1- Tenha cuidado ao executar um programa externo, pois udev
a execução será suspensa durante a execução do programa externo. Melhor dizendo, ele irá esperar até que o programa externo seja encerrado antes de prosseguir. Você ainda pode executar um programa prolixo, mas deve "desconectá-lo" imediatamente, executando-o em segundo plano. No seu caso, motoe.sh
provavelmente deveria ler:
#!/bin/bash
{
motoemount.sh
motoedesktop.sh
} &
que é equivalente a { motoemount.sh; motoedesktop.sh }&
, ou seja, executarmotoedesktop.sh
incondicionalmentedepois de motoemount.sh
ter saído.
Observe que :
$ motoemount.sh &; motoedesktop.sh
significa que motoemount.sh
e motoedesktop.sh
são executados de forma assíncrona, ou seja, motoedesktop.sh
começam a ser executados antes motoemount.sh
mesmo de sair.
$ motoemount.sh && motoedesktop.sh
Não é a mesma coisa. Nesse caso, motoedesktop.sh
é executado SOMENTE se o valor de saída motoemount.sh
for "0".
[....] Se eu executar motoe.sh a partir de um terminal, ele será executado corretamente
-2- udev
não executa programas externos em nenhum terminal ativo e não os executa no contexto de um shell. Certifique-se de garantir que seu programa esteja marcado como executável; se for um script de shell, certifique-se de que ele comece com um shebang apropriado (por exemplo, #!/bin/sh). O ambiente que udev
você vê não será o mesmo ambiente que você (ou quem quer que seja $USER) obtém no console. Portanto, especifique caminhos absolutos para todos os seus comandos:
motoemount.sh
-> /path/to/motoemount.sh
motoedesktop.sh
- /path/to/motoedesktop.sh
go-mtpfs
> -> ...
gmessage
-> ...
rdesktop
-> ...
umount
->/bin/umount
Para encontrar um caminho para cmds do sistema (como umount
), você pode usar o cmd which [cmd]
sem colchetes, por exemplo:
$ which umount
/bin/umount
-3- Verifique se o seu processo tem privilégios suficientes para desmontar/media/MyAndroid/
[....] Se eu executar motoe.sh a partir de um terminal, ele será executado corretamente
-4- Se você imprimir na tela (não tenho certeza, pois não estou familiarizado, gmessage
mas parece que você faz), certifique-se de que sua variável de ambiente DISPLAY esteja definida (conhecida pelo udev) e exportada (passada para sub- cartuchos). Caso contrário, não espere que nenhuma saída padrão apareça no seu terminal. Para ver um exemploesse, em particular a # set DISPLAY
seção.