Правило udev для Android не работает с go-mtpfs

Правило udev для Android не работает с go-mtpfs

В Ubuntu 12.04 мое правило запускает скрипт, вызываемый motoe.shпри подключении Motorola Moto E к USB-порту машины. Мое пользовательское правило не работает.

Правило таково:

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/

Все скрипты .sh имеют установленные разрешения на выполнение.

Я пробовал использовать SUBSYSTEM, SUBSYSTEMS, с DRIVER, без DRIVER, но никакого эффекта.

Не понимаю, что я упустил. Если я запускаю motoe.shиз терминала, то все работает правильно.

решение1

-1- Будьте осторожны, когда запускаете внешнюю программу, так как udevвыполнение будет приостановлено во время выполнения внешней программы. Лучше сказать, он будет ждать, пока внешняя программа завершит работу, прежде чем продолжить. Вы все еще можете выполнить длинную программу, но вы должны немедленно "отсоединить" ее, запустив в фоновом режиме. В случае yr, yr, motoe.shвероятно, следует читать:

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

что эквивалентно { motoemount.sh; motoedesktop.sh }&, т.е. выполнениюmotoedesktop.sh безусловнопосле motoemount.shвыхода.

Обратите внимание, что :

$ motoemount.sh &; motoedesktop.sh

означает, что motoemount.shи motoedesktop.shвыполняются асинхронно, т.е. motoedesktop.shначинают выполнение motoemount.shеще до выхода.

$ motoemount.sh && motoedesktop.sh

не то же самое. В этом случае motoedesktop.shвыполняется ТОЛЬКО если выходное значение motoemount.shравно "0".

[....] Если я запускаю motoe.sh из терминала, он работает правильно

-2- udevне запускает внешние программы на любом активном терминале и не выполняет их в контексте оболочки. Убедитесь, что ваша программа помечена как исполняемая, если это скрипт оболочки, убедитесь, что он запускается с соответствующим shebang (например, #!/bin/sh). Видимая среда udevне будет той же средой, которую вы (или кто-то еще, $USER) получаете на консоли. Поэтому укажите абсолютные пути для всех ваших команд:

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

Чтобы найти путь к системным cmd (например, umount), можно использовать cmd which [cmd]без скобок, например:

$ which umount
/bin/umount

-3- Убедитесь, что ваш процесс имеет достаточные права для размонтирования/media/MyAndroid/

[....] Если я запускаю motoe.sh из терминала, он работает правильно

-4- Если вы печатаете на экран (не уверен, что вы это делаете, так как я не знаком с этим, gmessageно похоже, что вы это делаете), убедитесь, что ваша переменная окружения DISPLAY установлена ​​(известна udev) и экспортирована (передается в под-оболочки). В противном случае не ожидайте, что какой-либо стандартный вывод появится на вашем терминале. Для примера см.этот, в частности # set DISPLAYраздел.

Связанный контент