Udev-Regel für USB-Anschließen/Trennen wird nicht ausgelöst

Udev-Regel für USB-Anschließen/Trennen wird nicht ausgelöst

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.rulesin 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/testwurde 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 infound 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 .rulesvon 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/testes 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 RUNausgefü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 RUNBefehl sollten absolut sein
  • Die Datei muss ausführbar sein
  • Die PATHUmgebung 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 PATHUmgebung auch innerhalb Ihres Skripts erweitern.

Überprüfen Sie, welcher Pfad definiert ist, indem Sie die setAusgabe 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'

verwandte Informationen