Ich versuche, ein Skript einzurichten, das jedes Mal ausgeführt wird, wenn ich ein USB-Gerät anschließe. Ich habe die Datei /etc/udev/rules.d/90-local.rules erstellt und die folgende Regel hinzugefügt:
ACTION=="add", SUBSYSTEM=="usb", KERNEL=="sd*", SYSFS{model}=="Cruzer*", RUN+="sh /home/jesse/Documents/Scripts/cruzer.sh"
Das Problem ist, dass beim Anschließen des Laufwerks nichts passiert. Das Skript ist für Debugging-Zwecke so manipuliert, dass es eine Benachrichtigung mit notify-send sendet, die installiert ist und vom Terminal aus einwandfrei funktioniert.
Der Pfad zum Skript ist korrekt, da ich den genauen Befehl ohne Probleme im Terminal ausgeführt habe.
Antworten:
Ich hatte das gleiche problem Das hat bei mir funktioniert:
Versuchen Sie, Ihr Skript zu kopieren
/usr/local/bin
und das Verzeichnis in Ihrer.rules
Datei zu ändern .Ich weiß auch nicht, was SYSFS ist, aber ich würde es vorziehen, die ATTR-Eigenschaften zu verwenden.
Die folgende Zeile ist der Inhalt meiner
.rules
Datei:quelle
ATTRS{vendor}=="SanDisk "
teil heißt das, dass nurSandisk
noch erkannt wird?notify-send
erfordert Zugriff auf Ihren DBus-Sitzungsbus, den er aus zwei Gründen nicht haben kann:Keine Informationen zur Sitzung. Wenn Ihr Skript von udev gestartet wird, weiß es nichts darüber, wo Sie angemeldet sind oder ob Sie überhaupt angemeldet sind. Multi-Seat mit X11 ist immer noch schwierig, aber der Benutzerwechsel funktioniert sowohl für X11- als auch für Konsolensitzungen. Viele Leute benutzen auch SSH, VNC und NX über das Netzwerk.
(
DISPLAY=:0
Würde die Hälfte der Zeit arbeiten, aber das ist bestenfalls noch zu raten .)Von der DBus-Richtlinie abgelehnt. Selbst wenn Ihr Skript Ihre X11-Sitzung irgendwie findet, kann es keine Benachrichtigungen senden, da das Skript
root
anstelle Ihres Benutzerkontos ausgeführt wird.quelle
for LINE in $(find /proc/ -maxdepth 2 -name environ -exec grep -z "^DBUS_SESSION_BUS_ADDRESS" {} \; | sort -uz | tr '\0' '\n'); do eval $LINE ... done;
habe den Trick für mich mit benachrichtigen-sendenSie können stattdessen versuchen, das Gerät nach Hersteller- und Produkt-IDs abzugleichen. Die folgende benutzerdefinierte Regel funktioniert für mich:
Sie können idVendor und idProduct in der lsusb-Ausgabe oder in dmesg sehen, nachdem Sie das Gerät angeschlossen haben.
quelle
Alehs Antwort weiterverfolgen: Wenn Sie auch
remove
Ereignisse überwachen möchten , müssen Sie nach einer Umgebungsvariablen mit dem Namen suchenID_SERIAL
. Es enthält Hersteller- und Produkt-ID, die durch einen Unterstrich getrennt sind:Die Regel ist jetzt auch kürzer.
quelle
Möglicherweise müssen Sie
sleep
innerhalb des Skripts ein hinzufügen , um dem USB-Gerät die Möglichkeit zu geben, sich zu "beruhigen"? Zum Beispiel USB 3G-Modems, Moduswechsel, um ein / dev / ttyUSB vom Kernel zum Laufen zu bringen.quelle
Versuchen Sie, SUBSYSTEM = "usb" durch SUBSYSTEMS = "usb" zu ersetzen.
quelle
SUBSYSTEM=="usb"
ist gut so.