Unter Ubuntu 12.04 löst meine Regel ein Skript aus, das aufgerufen wird, motoe.sh
wenn ein Motorola Moto E an den USB-Anschluss des Computers angeschlossen wird. Meine benutzerdefinierte Regel funktioniert nicht.
Es gilt die Regel:
ACTION=="add", SUBSYSTEMS=="usb", ATTRS{idVendor}=="22b8", ATTRS{idProduct}=="2e76", RUN+="/usr/local/bin/motoe.sh"
motoe.sh
Ist:
#!/bin/bash
motoemount.sh & motoedesktop.sh
motoemount.sh
Ist:
#!/bin/bash
go-mtpfs /media/MyAndroid
motoedesktop.sh
Ist:
#!/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/
Für alle .sh-Skripte ist die Ausführungsberechtigung festgelegt.
Ich habe versucht, SUBSYSTEM, SUBSYSTEMS, mit DRIVER ohne DRIVER zu verwenden, ohne Wirkung.
Ich weiß nicht, was ich ausgelassen habe. Wenn ich es motoe.sh
von einem Terminal aus ausführe, läuft es korrekt.
Antwort1
-1- Seien Sie vorsichtig, wenn Sie ein externes Programm ausführen, da udev
die Ausführung während der Ausführung des externen Programms angehalten wird. Besser gesagt, es wird gewartet, bis das externe Programm beendet wird, bevor es fortfährt. Sie können ein langwieriges Programm immer noch ausführen, müssen es jedoch sofort „abkoppeln“, indem Sie es im Hintergrund ausführen. In diesem Fall motoe.sh
sollte yr wahrscheinlich lauten:
#!/bin/bash
{
motoemount.sh
motoedesktop.sh
} &
was gleichbedeutend ist mit { motoemount.sh; motoedesktop.sh }&
, d. h. Ausführenmotoedesktop.sh
bedingungslosnachdem motoemount.sh
es beendet wurde.
Beachten Sie, dass :
$ motoemount.sh &; motoedesktop.sh
bedeutet, dass motoemount.sh
und motoedesktop.sh
asynchron ausgeführt werden, d. h. motoedesktop.sh
die Ausführung beginnt, bevor motoemount.sh
es überhaupt beendet wird.
$ motoemount.sh && motoedesktop.sh
ist nicht dasselbe. In diesem Fall motoedesktop.sh
wird NUR ausgeführt, wenn der Exit-Wert motoemount.sh
„0“ ist.
[....] Wenn ich motoe.sh von einem Terminal aus ausführe, läuft es korrekt
-2- udev
führt keine externen Programme auf einem aktiven Terminal aus und führt sie nicht im Kontext einer Shell aus. Stellen Sie sicher, dass Ihr Programm als ausführbar markiert ist. Wenn es sich um ein Shell-Skript handelt, stellen Sie sicher, dass es mit einem entsprechenden Shebang beginnt (z. B. #!/bin/sh). Die angezeigte Umgebung udev
ist nicht die gleiche Umgebung, die Sie (oder wer auch immer $USER ist) auf der Konsole erhalten. Geben Sie daher absolute Pfade für alle Ihre Befehle an:
motoemount.sh
-> /path/to/motoemount.sh
motoedesktop.sh
-> /path/to/motoedesktop.sh
go-mtpfs
-> ...
gmessage
-> ...
rdesktop
-> ...
umount
->/bin/umount
Um einen Pfad für Systembefehle (wie umount
) zu finden, können Sie den Befehl which [cmd]
ohne Klammern verwenden, zB:
$ which umount
/bin/umount
-3- Überprüfen Sie, ob Ihr Prozess über ausreichende Berechtigungen zum Unmounten verfügt/media/MyAndroid/
[....] Wenn ich motoe.sh von einem Terminal aus ausführe, läuft es korrekt
-4- Wenn Sie auf dem Bildschirm drucken (ich bin mir nicht sicher, ob Sie das tun, da ich mich damit nicht auskenne, gmessage
aber es sieht so aus), stellen Sie sicher, dass Ihre Umgebungsvariable DISPLAY gesetzt (von udev erkannt) und exportiert (an Sub-Shells weitergegeben) ist. Andernfalls erwarten Sie keine Standardausgabe auf Ihrem Terminal. Ein Beispiel finden Sie unterDas, insbesondere der # set DISPLAY
Abschnitt.