Android 的 udev 規則不適用於 go-mtpfs

Android 的 udev 規則不適用於 go-mtpfs

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.shmotoedesktop.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部分。

相關內容