regra udev para Android não funciona com go-mtpfs

regra udev para Android não funciona com go-mtpfs

No Ubuntu 12.04, minha regra dispara um script chamado motoe.shquando 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.sha partir de um terminal, ele será executado corretamente.

Responder1

-1- Tenha cuidado ao executar um programa externo, pois udeva 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.shprovavelmente deveria ler:

#!/bin/bash
{ 
   motoemount.sh
   motoedesktop.sh
} &

que é equivalente a { motoemount.sh; motoedesktop.sh }&, ou seja, executarmotoedesktop.sh incondicionalmentedepois de motoemount.shter saído.

Observe que :

$ motoemount.sh &; motoedesktop.sh

significa que motoemount.she motoedesktop.shsão executados de forma assíncrona, ou seja, motoedesktop.shcomeçam a ser executados antes motoemount.shmesmo de sair.

$ motoemount.sh && motoedesktop.sh

Não é a mesma coisa. Nesse caso, motoedesktop.shé executado SOMENTE se o valor de saída motoemount.shfor "0".

[....] Se eu executar motoe.sh a partir de um terminal, ele será executado corretamente

-2- udevnã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 udevvocê 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, gmessagemas 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 DISPLAYseção.

informação relacionada