В 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
раздел.