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
外部プログラムの実行中は実行が中断されるので注意してください。より正確に言うと、外部プログラムが終了するまで待機してから続行します。長いプログラムを実行することもできますが、バックグラウンドで実行してすぐに「切り離す」必要があります。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
、アクティブな端末上で外部プログラムを実行しません。また、シェルのコンテキストで実行することもありません。プログラムが実行可能としてマークされていることを確認してください。シェル スクリプトの場合は、適切なシェバン (例: #!/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- yrプロセスにアンマウントするのに十分な権限があることを確認する/media/MyAndroid/
[....] ターミナルからmotoe.shを実行すると、正常に実行されます
-4- 画面に印刷する場合(よく知らないのですが、gmessage
おそらくそうしているようです)、DISPLAY環境変数が設定され(udevに認識され)、エクスポートされている(サブシェルに渡される)ことを確認してください。そうでない場合は、端末に標準出力が表示されません。例については、これ、特に# set DISPLAY
セクション。