motoe.sh
在 Ubuntu 12.04 上,我的規則會在 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
在外部程式執行期間執行將被暫停。更好地說,它將等到外部程式退出後再繼續。您仍然可以執行冗長的程序,但必須透過在背景運行它來立即「分離」它。對於你的情況,你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
不在任何活動終端上運行外部程序,並且不在 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
為了找到系統 cmd 的路徑(例如umount
),您可以使用不含括號的 cmd which [cmd]
,例如:
$ which umount
/bin/umount
-3- 驗證您的進程是否有足夠的權限來卸載/media/MyAndroid/
[....] 如果我從終端執行 motoe.sh,它會正確運行
-4-如果您列印到螢幕(不確定您是否這樣做,因為我不熟悉,gmessage
但看起來像您這樣做),請確保您的DISPLAY 環境變數已設定(udev 已知)並匯出(傳遞給子-貝殼)。否則,不要指望任何標準輸出會出現在您的終端上。有關範例,請參閱這,特別是該# set DISPLAY
部分。