На 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
от терминала это работает правильно.
- 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
раздел.