udev управляют для андроида, не работающего с движением-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 сценарии имеют набор полномочий выполнения.

Я пытался использовать ПОДСИСТЕМУ, ПОДСИСТЕМЫ, с ДРАЙВЕРОМ без ДРАЙВЕРА и никаким эффектом.

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

0
задан 3 February 2016 в 12:01

1 ответ

- 1-Быть осторожным, когда Вы запускаете внешнюю программу как udev выполнение будет приостановлено во время осуществления внешней программы. Лучше сказанный, это будет ожидать до внешних выходов программы перед продолжением. Можно все еще выполнить длинную обветренную программу, но необходимо сразу "отсоединить" ее путем выполнения ее в фоновом режиме. В Вашем случае, Вашем 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 не запускает внешние программы ни на каком активном терминале, и он не выполняет их под контекстом оболочки. Обязательно удостоверьтесь, что Ваша программа отмечена исполняемый файл, если это - сценарий оболочки, гарантируют, что это запускается с соответствующей хижины (например, #!/bin/sh). Среда это udev видит не будет та же среда, которая Вы (или кто бы ни $USER), входит в консоль. Поэтому укажите полные пути для всех своих команд:

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

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

$ which umount
/bin/umount

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

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

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

0
ответ дан 29 September 2019 в 12:59

Другие вопросы по тегам:

Похожие вопросы: