Ich möchte ein Skript ausführen, wenn ich ein Gerät an meinen Linux-Computer anschließe. Führen Sie beispielsweise xinput
eine Maus oder ein Backup-Skript auf einem bestimmten Laufwerk aus.
Ich habe viele Artikel darüber gesehen, zuletzt hier und hier . Aber ich kann es einfach nicht zum Laufen bringen.
Hier einige einfache Beispiele, die versuchen, zumindest eine Antwort zu erhalten.
/etc/udev/rules.d/test.rules
#KERNEL=="sd*", ATTRS{vendor}=="*", ATTRS{model}=="*", ATTRS{serial}=="*", RUN+="/usr/local/bin/test.sh"
#KERNEL=="sd*", ACTION=="add", "SUBSYSTEM=="usb", ATTRS{model}=="My Book 1140 ", ATTRS{serial}=="0841752394756103457194857249", RUN+="/usr/local/bin/test.sh"
#ACTION=="add", "SUBSYSTEM=="usb", RUN+="/usr/local/bin/test.sh"
#KERNEL=="sd*", ACTION=={add}, RUN+="/usr/local/bin/test.sh"
KERNEL=="sd*", RUN+="/usr/local/bin/test.sh"
KERNEL=="*", RUN+="/usr/local/bin/test.sh"
/usr/local/bin/test.sh
#!/usr/bin/env bash
echo touched >> /var/log/test.log
if [ "${ACTION}" = "add" ] && [ -f "${DEVICE}" ]
then
echo ${DEVICE} >> /var/log/test.log
fi
Der Regelordner wird von überwacht inotify
und sollte sofort aktiv sein. Ich stelle meine Tastatur, Maus, Tablet, Memorystick und das USB-Laufwerk immer wieder auf den neuesten Stand, aber nichts. Keine Protokolldatei berührt.
Nun, was wäre der einfachste Weg, um wenigstens zu wissen, dass etwas funktioniert? Es ist einfacher, mit etwas zu arbeiten, das funktioniert, als mit etwas, das nicht funktioniert.
udevadm trigger
ein Gerät ausgeführt oder angeschlossen, um die neue Regel anzuwenden?3.5.0-23-generic
.Antworten:
Wenn Sie das Skript auf einem bestimmten Gerät ausführen möchten, können Sie die Hersteller- und Produkt-IDs verwenden
In
/etc/udev/rules.d/test.rules
:in
test.sh
:Mit
env
können Sie sehen, welche Umgebung in udev eingestellt ist, und mitfile
können Sie den Dateityp ermitteln.Die konkreten Attribute für Ihr Gerät können mit ermittelt werden
lsusb
gibt
quelle
ACTION=="add",
direkt zur Regeldefinition hinzufügen .Hier geht es nicht direkt um Ihre Frage, sondern darum, was Sie tun. Wenn Sie ein Backup-Skript von udev aus starten, treten zwei Hauptprobleme auf:
Mein Rat ist, ein Skript in Ihrem Benutzerhaus zu erstellen, das eine Named Pipe abhört und asynchron gestartet wird:
Hinweis: Ich verwende Auto-Mount mit KDE, um zu überprüfen, ob der Ordner angezeigt wird. Sie können den / dev / sd * -Parameter im FIFO aus der udev-Regel übergeben und selbst im Skript einbinden. Um in das Fifo zu schreiben, vergiss nicht, dass udev keine Shell ist und die Umleitung nicht funktioniert. Dein RUN sollte so aussehen:
RUN + = "/ bin / sh -c '/ bin / echo connected >> / tmp / IomegaUsbPipe'"
quelle
Ich habe eine Lösung auf https://askubuntu.com/a/516336 gepostet und kopiere die Lösung auch hierher.
Ich habe mit pyudev ein Python-Skript geschrieben , das ich im Hintergrund laufen lassen möchte . Dieses Skript lauscht auf udev-Ereignisse (daher ist es sehr effizient) und führt den von mir gewünschten Code aus. In meinem Fall läuft es
xinput
Befehle zum Einrichten meiner Geräte ( Link auf die neueste Version ).Hier ist eine kurze Version desselben Skripts:
quelle
call()
. Auf diese Weisefoobar.sh
können Sie das dynamisch tun, wenn es erforderlich ist, Argumente für das Skript bereitzustellen .Um das Skript auf dem Boot auszuführen, wenn ein USB-Gerät angeschlossen ist, verwende ich die folgende Lösung:
Formatieren Sie den USB-Stick oder einen anderen USB-Speicher und geben Sie ihm dabei einen Namen. Dann in
/etc/rc.local
Zeile hinzufügenls -q /dev/disk/by-label > /home/pi/label.txt
Es wird eine TXT-Datei mit dem Namen label.txt erstellt (kann ein beliebiger anderer Name sein).
dann nochmal in /etc/rc.local 2 Zeilen hinzufügen:
Jedes Mal, wenn ein pendrive mit dem Namen USB_drive_name eingefügt wird, wird das Skript ausgeführt.
Mit ein paar kleinen Änderungen kann die obige Lösung verwendet werden, wenn das System in Betrieb ist.
quelle
udev
für andere Zeiten sind keine "kleinen Änderungen") und den Raspberry Pi. Es ist eine unnötigesudo
-rc.local
läuft als root, es ist ein Privileg Eskalation Problem - eine Datei , die von einem normalen Benutzer editierbar ist , wird als root ausgeführt.