Ich habe versucht udev
, ein Debian-System dazu zu bringen, ein Bash-Skript auszuführen, wenn eine drahtlose Karte verbunden ist.
Bisher habe ich diese Datei erstellt /etc/udev/rules.d/wifi-detect.rules
:
ACTION=="add", ATTRS{idVendor}=="0cf3", ATTRS{idProduct}=="9271", RUN+="/root/test.sh"
Und im Moment versuche ich, test.sh
mit diesen Inhalten zu arbeiten:
#!/bin/bash
/bin/echo "test!" > /test.txt
Aber aus irgendeinem Grund scheint nichts zu passieren, wenn ich die WLAN-Karte verbinde. Es wird keine test.txt
Datei erstellt.
Mein lsusb
auf der Karte:
Bus 001 Device 015: ID 0cf3:9271 Atheros Communications, Inc. AR9271 802.11n
Laufen udevadm monitor –env
das ist , was passiert , wenn ich die Karte anschließen:
KERNEL[1017.642278] add /devices/platform/bcm2708_usb/usb1/1-1/1-1.3 (usb)
KERNEL[1017.644676] add /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0 (usb)
KERNEL[1017.645035] add /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/firmware/1-1.3 (firmware)
KERNEL[1017.708056] remove /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/firmware/1-1.3 (firmware)
UDEV [1017.714772] add /devices/platform/bcm2708_usb/usb1/1-1/1-1.3 (usb)
UDEV [1017.733002] remove /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/firmware/1-1.3 (firmware)
UDEV [1017.772669] add /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/firmware/1-1.3 (firmware)
UDEV [1017.798707] add /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0 (usb)
KERNEL[1018.456804] add /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/ieee80211/phy8 (ieee80211)
KERNEL[1018.465994] add /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/net/wlan0 (net)
KERNEL[1018.479878] add /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/leds/ath9k_htc-phy8 (leds)
KERNEL[1018.483074] add /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/usb_device/usbdev1.20 (usb_device)
UDEV [1018.600456] add /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/leds/ath9k_htc-phy8 (leds)
UDEV [1018.604376] add /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/ieee80211/phy8 (ieee80211)
UDEV [1018.626243] add /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/usb_device/usbdev1.20 (usb_device)
KERNEL[1018.659318] move /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/net/wlan1 (net)
UDEV [1018.758843] add /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/net/wlan1 (net)
UDEV [1018.932207] move /devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/net/wlan1 (net)
Ich habe viele Beispiele ausprobiert, aber ich kann es nicht zum Laufen bringen. Ich hoffe jemand kann mir dabei helfen;) Danke!
BEARBEITEN:
Um die Sache zu vereinfachen, habe ich meine Regel geändert in:
ACTION=="add", ATTRS{idVendor}=="0cf3", ATTRS{idProduct}=="9271", RUN+="/bin/echo 'test' > /test.txt"
Ich habe es geschafft, udevadm control --log-priority=info
wie von @ user1146332 vorgeschlagen festzulegen, und ich habe dieses interessante Protokoll erhalten:
Sep 9 16:27:53 iklive-rpi1 udevd[1537]: RUN '/bin/echo 'test' > /test.txt' /etc/udev/rules.d/wifi-detect.rules:1
Sep 9 16:27:53 iklive-rpi1 udevd[1544]: starting 'firmware.agent'
Sep 9 16:27:53 iklive-rpi1 udevd[126]: seq 663 queued, 'remove' 'firmware'
Sep 9 16:27:53 iklive-rpi1 udevd[126]: seq 663 forked new worker [1547]
Sep 9 16:27:53 iklive-rpi1 udevd[1537]: 'firmware.agent' [1544] exit with return code 0
Sep 9 16:27:53 iklive-rpi1 udevd[1548]: starting '/bin/echo 'test' > /test.txt'
Sep 9 16:27:53 iklive-rpi1 udevd[1547]: seq 663 running
Sep 9 16:27:53 iklive-rpi1 udevd[1547]: no db file to read /run/udev/data/+firmware:1-1.3.4: No such file or directory
Sep 9 16:27:53 iklive-rpi1 udevd[1547]: passed -1 bytes to netlink monitor 0x1af5ee0
Sep 9 16:27:53 iklive-rpi1 udevd[126]: seq 663 done with 0
Sep 9 16:27:53 iklive-rpi1 udevd[1547]: seq 663 processed with 0
Sep 9 16:27:53 iklive-rpi1 udevd[1537]: '/bin/echo 'test' > /test.txt'(out) 'test > /test.txt'
Sep 9 16:27:53 iklive-rpi1 udevd[1537]: '/bin/echo 'test' > /test.txt' [1548] exit with return code 0
Also ... Ist das nicht der return code 0
Exit-Code für einen erfolgreichen Abschluss? Wenn ja, warum bekomme ich keine Datei auf dem System?
EDIT 2:
Ich habe es geschafft, dies mit dem Tipp von @htor zum Laufen zu bringen. Meine aktuelle Regel:
ACTION=="add", ATTRS{idVendor}=="0cf3", ATTRS{idProduct}=="9271", RUN+="/bin/sh -c '/bin/echo test >> /test.txt'"
Aber aus irgendeinem Grund wird der Befehl achtmal ausgeführt. Gibt es eine Möglichkeit, dies zu vermeiden? Ich denke, das passiert, weil die Treiber der drahtlosen Karte beim Laden praktisch abmontiert und montiert werden müssen. Tipps?
quelle
/bin/echo
erfolgreich ausgeführt wurde, wie Ihr Protokoll vorschlägt. Die Ausgabe Ihres Befehls erfolgttest > /test.txt
wie in Ihrem Protokoll angegeben. Der Grund dafür ist, dass der Charakter>
in Ihrem Kontext überhaupt keine besondere Bedeutung hat. Es ist nur das dritte Befehlszeilenargument, an das Sie übergeben habenecho
. Sie erhalten, was Sie wollen, wenn Sie Ihre Shell die angegebene Zeile interpretieren lassen/bin/echo 'test' > /test.txt
. Wie bei Ihrer zweiten Bearbeitung. Wenn Sie beispielsweise im Gegensatz zu dem, was Sie getan haben ,udev
ausführen lassen , wirdtouch /test.txt
eine neue Datei in Ihrem Stammverzeichnis angezeigt.Antworten:
Ich hatte vor einiger Zeit ein ähnliches Problem und die Lösung bestand darin, das
RUN+=
Teil auf zu ändernRUN+="sh -c '/root/test.sh'"
. Jetzt weiß ich nicht, ob Sie das in diesem Fall brauchen, da die Regel ein Skript aufruft, keinen Befehl.Eine weitere Beobachtung: Versuchen Sie, das
!
aus der"test!"
Zeichenfolge zu entfernen, oder ersetzen Sie die doppelten Anführungszeichen durch einfache Anführungszeichen. Der Knall!
macht wahrscheinlich Probleme wegen seiner besonderen Bedeutung in der Schale und die doppelten Anführungszeichen bewahren diese Bedeutung.quelle
!
funktioniert es nicht.RUN+="/bin/sh -c '/bin/echo test >> /test.txt'"
funktioniert, aber aus irgendeinem Grund wurde "Test" 8 Mal in die Datei geschrieben. Es scheint, als würde der Befehl mehrmals ausgeführt: SMein Rat wäre, die Protokollierungspriorität von
udev
vonerr
bisinfo
mit festzulegenWenn Sie noch mehr Informationen sehen möchten, stellen Sie diese ein
debug
. Jetzt finden Sie sehr detaillierte Informationen darüber, wasudev
in/var/log/daemon.log
(zumindest auf einem Debian-bezogenen System) geschehen ist. Im Allgemeinen hilft das sehr, Fehler zu verfolgen.Dies ist nur eine Ergänzung zu der Antwort von htor, die wahrscheinlich Ihr Problem löst.
quelle