En Ubuntu 12.04, mi regla activa un script que se llama motoe.sh
cuando un Motorola Moto E está conectado al puerto USB de la máquina. Mi regla personalizada no funciona.
La regla es:
ACTION=="add", SUBSYSTEMS=="usb", ATTRS{idVendor}=="22b8", ATTRS{idProduct}=="2e76", RUN+="/usr/local/bin/motoe.sh"
motoe.sh
es:
#!/bin/bash
motoemount.sh & motoedesktop.sh
motoemount.sh
es:
#!/bin/bash
go-mtpfs /media/MyAndroid
motoedesktop.sh
es:
#!/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 los scripts .sh tienen el permiso de ejecución establecido.
Intenté usar SUBSISTEMA, SUBSISTEMAS, con DRIVER sin DRIVER y sin efecto.
No me imagino lo que me perdí. Si ejecuto motoe.sh
desde una terminal, se ejecuta correctamente.
Respuesta1
-1- Tenga cuidado al ejecutar un programa externo ya que udev
la ejecución se suspenderá durante la ejecución del programa externo. Mejor dicho, esperará hasta que el programa externo salga antes de continuar. Aún puedes ejecutar un programa largo pero debes "separarlo" inmediatamente, ejecutándolo en segundo plano. En su caso, motoe.sh
probablemente debería leer:
#!/bin/bash
{
motoemount.sh
motoedesktop.sh
} &
lo que equivale a { motoemount.sh; motoedesktop.sh }&
, es decir, ejecutarmotoedesktop.sh
incondicionalmentedespués de motoemount.sh
haber salido.
Tenga en cuenta que :
$ motoemount.sh &; motoedesktop.sh
significa que motoemount.sh
y motoedesktop.sh
se ejecutan de forma asincrónica, es decir, motoedesktop.sh
comienzan a ejecutarse incluso antes motoemount.sh
de salir.
$ motoemount.sh && motoedesktop.sh
no es lo mismo. En ese caso, motoedesktop.sh
se ejecuta SÓLO si el valor de salida motoemount.sh
es "0".
[....] Si ejecuto motoe.sh desde una terminal, se ejecuta correctamente
-2- udev
no ejecuta programas externos en ningún terminal activo y no los ejecuta bajo el contexto de un shell. Asegúrese de que su programa esté marcado como ejecutable; si es un script de shell, asegúrese de que comience con un shebang apropiado (por ejemplo, #!/bin/sh). El entorno que udev
ve no será el mismo que usted (o quien sea $USER) tiene en la consola. Así que especifica rutas absolutas para todos tus comandos:
motoemount.sh
-> /path/to/motoemount.sh
motoedesktop.sh
-> /path/to/motoedesktop.sh
go-mtpfs
-> ...
gmessage
-> ...
rdesktop
-> ...
umount
->/bin/umount
Para encontrar una ruta para los cmds del sistema (como umount
), puede usar el cmd which [cmd]
sin corchetes, por ejemplo:
$ which umount
/bin/umount
-3- Verifique que su proceso tenga privilegios suficientes para desmontar/media/MyAndroid/
[....] Si ejecuto motoe.sh desde una terminal, se ejecuta correctamente
-4- Si imprime en la pantalla (no estoy seguro de hacerlo, ya que no estoy familiarizado con esto, gmessage
pero parece que sí), asegúrese de que su variable de entorno DISPLAY esté configurada (conocida por udev) y exportada (pasada a sub- conchas). De lo contrario, no espere que aparezca ninguna salida estándar en su terminal. Para un ejemplo vereste, en particular la # set DISPLAY
sección.