
Ich verwende RHEL6 und versuche, eine Udev-Regel zu schreiben, die beim Anschließen und Entfernen von USB-Geräten ausgelöst wird. Ich habe eine Datei mit dem Namen 80-usb.rules
in erstellt /etc/udev/rules.d/
und ihr den folgenden Inhalt gegeben (bisher nichts zu Spezifisches, ich möchte nur testen):
ACTION=="add", SUBSYSTEMS=="usb", RUN+="touch /tmp/test"
Ich habe die Datei gespeichert und zum Testen ein USB-Laufwerk angeschlossen. Die Datei /tmp/test
wurde jedoch nicht erstellt.
Ich gehe davon aus, dass meine Udev-Regel mit meinem USB-Laufwerk übereinstimmen sollte, da ich auf dem USB-Laufwerk ausführen kann udevadm info
und mindestens eines der übergeordneten Geräte das Attribut hat SUBSYSTEMS=="usb"
.
Warum wird die Udev-Regel möglicherweise nicht ausgelöst?
Ich habe versucht, es auszuführen udevadm test --action=add /path/to/device
, und es ist klar, dass die .rules
von mir geschriebene Datei verarbeitet wird und dass meine Regeln abgeglichen werden. Hier sind einige relevante Zeilen aus der Ausgabe:
parse_file: reading '/etc/udev/rules.d/80-usb.rules' as rules file
udev_rules_apply_to_event: RUN '/bin/touch /tmp/test' /etc/udev/rules.d/80-usb.rules:1
udevadm_test: run: '/bin/touch /tmp/test'
Aber /tmp/test
es existiert immer noch nicht. Ich bin so verwirrt. Offensichtlich wird diese Regel erfüllt und die Regeln werden angewendet. Warum wird der angegebene Befehl dann nicht RUN
ausgeführt?
Antwort1
Ihre Regel muss einen absoluten Pfad für die ausführbare Datei angeben:
ACTION=="add", SUBSYSTEMS=="usb", RUN+="/usr/bin/touch /tmp/test"
Bearbeiten:
Und wenn Sie ein Skript ausführen möchten, müssen Sie angeben, welche Shell es ausführen soll:
ACTION=="add", SUBSYSTEMS=="usb", RUN+="/bin/sh /path/to/your/script"
Antwort2
Dabei musst Du folgendes sicherstellen:
- Pfade im
RUN
Befehl sollten absolut sein - Die Datei muss ausführbar sein
- Die
PATH
Umgebung ist bei der Ausführung Ihres Befehls begrenzt
Fügen Sie zunächst diese Skriptdatei hinzu/lib/udev/touch.sh
vim /lib/udev/touch.sh
Schreiben Sie in diese Datei:
#!/bin/bash
touch /tmp/test
ausführbar machen:
chmod +x /lib/udev/touch.sh
und ändern Sie Ihre Regeldatei wie folgt:
ACTION=="add", SUBSYSTEMS=="usb", RUN+="/lib/udev/touch.sh"
Laden Sie Ihre Udev-Regeln neu
udevadm control --reload-rules
Damit werden Ihre Regeln neu eingelesen /lib/udev/rules.d/*
. Änderungen sind erst jetzt wirksam.
Beachten Sie, dass udev Ihr Skript mit einer reduzierten Umgebung ausführt PATH
. Sie müssen sicherstellen, dass auf alle Binärdateien, die sich nicht in den konfigurierten Pfaden befinden, mit einem vollständigen Pfad zugegriffen werden muss. Sie können die PATH
Umgebung auch innerhalb Ihres Skripts erweitern.
Überprüfen Sie, welcher Pfad definiert ist, indem Sie die set
Ausgabe Ihres Wrapper-Skripts in einer Protokolldatei protokollieren:
set >>/tmp/udev-env-test
Es könnte so aussehen:
PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'