在 Ubuntu 12.04 上,当 Motorola Moto E 连接到机器 USB 端口时,我的规则会触发一个脚本motoe.sh
。我的自定义规则不起作用。
规则是:
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
在外部程序执行期间执行将被暂停。更确切地说,它将等到外部程序退出后再继续。您仍然可以执行冗长的程序,但必须立即“分离”它,方法是在后台运行它。在这种情况下,yrmotoe.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
不在任何活动终端上运行外部程序,也不在 shell 上下文中执行它们。请确保您的程序被标记为可执行,如果它是 shell 脚本,请确保它以适当的 shebang 开头(例如 #!/bin/sh)。udev
看到的环境与您(或任何 $USER)在控制台上获得的环境不同。因此,请为所有命令指定绝对路径:
motoemount.sh
-> /path/to/motoemount.sh
motoedesktop.sh
-> /path/to/motoedesktop.sh
go-mtpfs
-> ...
gmessage
-> ...
rdesktop
-> ...
umount
->/bin/umount
为了找到系统命令的路径(例如umount
),您可以使用不带括号的 cmd which [cmd]
,例如:
$ which umount
/bin/umount
-3- 验证您的进程是否具有足够的权限来卸载/media/MyAndroid/
[...] 如果我从终端执行 motoe.sh,它可以正确运行
-4- 如果您打印到屏幕(不确定您是否会这样做,因为我不熟悉,gmessage
但看起来您这样做了),请确保您的 DISPLAY 环境变量已设置(udev 已知)并导出(传递给子 shell)。否则,不要指望任何标准输出出现在您的终端上。有关示例,请参阅这,特别是该# set DISPLAY
部分。