Wie kann ich überprüfen, ob eine udev-Regel ausgelöst wurde?


15

Ich versuche mich unter Ubuntu 13.10 mit udev vertraut zu machen.

Hier ist meine erste einfache 95.usbbackup.rules-Regel:

ACTION=="add", SUBSYSTEMS="usb", RUN+="/usr/local/bin/my_backup.sh"

und hier ist das Skript (das chmodded + x) my_backup.sh:

#!/bin/bash
touch /tmp/test

Wenn ich externe Laufwerke anschließe, passiert überhaupt nichts. Wie kann ich überprüfen (ein Protokoll, ein Befehl, irgendetwas), ob die Regel ausgelöst wurde?

Danke vielmals


2
Ich denke du meinst SUBSYSTEMS=="usb". Dh doppelt, ==was auf Gleichheit prüft, anstatt einfach, =was einem Schlüssel einen Wert zuweist.
Lqueryvg

Antworten:


5

Ich bin mir ziemlich sicher, dass das funktionieren sollte. Haben Sie Ihre udev-Regeln nach dem Bearbeiten Ihrer Regeln neu geladen?

udevadm control --reload-rules && udevadm trigger als Wurzel.


Ich habe eine engere Regel aufgestellt: KERNEL == "sdb", was funktioniert. Behandelt udev nur Regeln, die bestimmte Hardware eindeutig identifizieren?
Pouzzler

Nein, versuchen KERNEL!="sdz*"Sie es und Sie sollten alles bekommen (außer sdz [1-9])
Redsandro

5
Dies beantwortet die Frage nicht wirklich. Woher wissen Sie, ob die Regeln ausgelöst wurden?
DanielSank

1
Sie wissen, weil das Skript ausgeführt wird. Sie können es in eine Protokolldatei schreiben lassen. Auchudevadm monitor
Redsandro

2

Sie können einen Befehl als root wie folgt eingeben:

udevadm Monitor

Es wird angezeigt, wann eine Regel ausgelöst wurde.


11
udevadm monitorzeigt nur die udev-Ereignisse an, aber nicht, wenn eine entsprechende Regel ausgelöst wurde. Sie können jedoch nach dem Ereignis suchen, das die Regel auslösen soll, wissen dann aber nicht, ob Ihre Regel funktioniert.
F. Raab

2

Ich verwende Kernel 3.0.35, aber das Folgende funktioniert für mich.

Um den Pfad für das Gerät zu erhalten, können Sie Folgendes tun:

udevadm info --name /dev/sda1 --query all

Sie erhalten mehr Informationen als Sie benötigen, interessieren sich aber für den DEVPATH. Um zu sehen, welche udev-Regeln ausgeführt werden, führen Sie Folgendes aus:

udevadm test DEVPATH

Ich glaube nicht, dass dies tatsächlich die Regeln ausführt. Die Dokumentation besagt, dass dies die Ereignisse für das gegebene Gerät "simuliert". Weitere Informationen finden Sie auf dieser Manpage: https://www.freedesktop.org/software/systemd/man/udevadm.html


1

Mit udev / systemd Version 241 und ähnlichem als root:

udevadm control --log-priority=debug
journalctl -f

Oder um es dauerhaft zu machen, wieder als Wurzel:

vi /etc/udev/udevd.conf
systemctl restart systemd-udevd
journalctl -f

PS: Die häufigste noch meiner Meinung nach falsche Antwort sieht aus wie:

udevadm -d test / Geräte / wo / ist / mein / Gerät | & weniger

... aber das hat eine Reihe von Problemen. Die wichtigsten:

  • where/is/my/device? Langwierig, kompliziert und fehleranfällig.

  • Der Vergleich alter Antworten mit der jüngsten Ausgabe von udev Version 241 udevadm testscheint weniger Informationen zu zeigen als früher.

  • udevadm -d test ist nur eine Simulation ! Jedes Mal warnt es:

    Dieses Programm dient nur zum Debuggen und führt kein durch einen RUN-Schlüssel angegebenes Programm aus. Möglicherweise werden falsche Ergebnisse angezeigt, da einige Werte möglicherweise unterschiedlich sind oder bei einem Simulationslauf nicht verfügbar sind.

udevadm test dient zur Entwicklung einer neuen Regel und nicht zur Fehlerbehebung bei fehlerhaften, fehlenden oder überschriebenen Regeln.


0

Ich hatte das gleiche Problem mit Raspberry Pi 3 B +. Ich habe versucht, beim Einstecken eines USB-Speichergeräts ein Skript aufzurufen. Die Regeln werden nicht im Syslog protokolliert, daher ist es sehr schwierig zu verstehen, welche Regel funktioniert hat oder welche Regel fehlgeschlagen ist.

Also habe ich folgendes gemacht:

  1. Ich habe meine Regeldatei in /etc/udev/rules.d/100-myrule.rules erstellt
  2. Dann habe ich den Befehl ausgeführt sudo /etc/init.d/udev restart

und als ich nachgesehen habe, hat es funktioniert.

Eine Information, die nützlich sein kann oder nicht, ist, dass die Dateisysteme für udev schreibgeschützt sind, bis der Befehl in Schritt 2 ausgeführt wird.


0

udevadm test $(udevadm info --query=path --name=device_name)sollte Ihnen unter Angabe der Regeln mitteilen, welche Befehle auf einem Geräte-Plug-In ausgeführt werden würdenudev . Zum Beispiel:

# udevadm test /block/sdd
...
udev_rules_apply_to_event: PROGRAM '/sbin/multipath -c /dev/sdd' /lib/udev/rules.d/40-multipath.rules:11
...
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.