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

0

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 o conjunto de permissões de execução.

Eu tentei usar SUBSYSTEM, SUBSYSTEMS, com DRIVER sem DRIVER e sem efeito.

Eu não entendo o que perdi. Se eu executar motoe.sh de um terminal, ele será executado corretamente.

    
por JPDev 02.02.2016 / 20:43

1 resposta

0

-1- Tenha cuidado ao executar um programa externo, pois udev execução será suspensa durante a execução do programa externo. Melhor dito, esperará até que o programa externo saia antes de prosseguir. Você ainda pode executar um programa prolixo, mas você deve "desconectá-lo" imediatamente, executando-o em segundo plano. No ano, yr motoe.sh provavelmente deveria ler:

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

que é equivalente a { motoemount.sh; motoedesktop.sh }& , ou seja, executando motoedesktop.sh incondicionalmente depois que motoemount.sh saiu.

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ça a executar antes que motoemount.sh saia.

$ motoemount.sh && motoedesktop.sh

não é o mesmo. Nesse caso, motoedesktop.sh será executado APENAS se o valor de saída de motoemount.sh for "0".

% bl0ck_qu0te%

-2- udev não executa programas externos em nenhum terminal ativo, e não os executa sob o contexto de um shell. Certifique-se de que seu programa está 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 vê não será o mesmo ambiente em que você (ou quem quer que seja $ USER) esteja no console. Então, especifique caminhos absolutos para todos os seus comandos:

motoemount.sh - > /path/to/motoemount.sh e motoedesktop.sh - > /path/to/motoedesktop.sh e go-mtpfs - > ...
gmessage - > ...
rdesktop - > ...
umount - > /bin/umount

Para encontrar um caminho para os cmds do sistema (como umount ), você pode usar o cmd which [cmd] sem colchetes, por exemplo:

$ which umount
/bin/umount

-3- Verifique se o processo yr tem privilégios suficientes para desmontar /media/MyAndroid/

% bl0ck_qu0te%

-4- Se você imprimir para a tela (não tenho certeza que você faz, como eu não estou familiarizado com gmessage , mas parece que você faz), verifique se sua variável de ambiente DISPLAY está definida (conhecida pelo udev) e exportada (passou para sub-shells). Caso contrário, não espere que qualquer saída padrão apareça no seu terminal. Por exemplo, veja isto , em particular a seção # set DISPLAY .

    
por Cbhihe 03.02.2016 / 08:26