Rufen Sie notify-send aus einer udev-Regel auf

13

Ich verwende Linux Mint 13 MATE und versuche, Benachrichtigungen einzurichten, wenn ich Geräte ein- / ausstecke.

Zuerst habe ich das Paket udev-notify gefunden , aber leider funktioniert es bei mir fast nicht: Es funktioniert nur für sehr kurze Zeit (1 bis 2 Minuten), und dann stürzt es ab, wenn ich ein Gerät verbinde / trenne:

Traceback (most recent call last):
  File "./udev-notify.py", line 319, in <module>
    notification.show()
glib.GError: GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: The name :1.1061 was not provided by any .service files

Ich habe keine Lösung gefunden, also musste ich sie entfernen. (abgelegtes Bugreport auch)

Überraschenderweise gibt es keine ähnlichen Dienstprogramme, die ich bisher gefunden habe. Dann habe ich versucht, udev-Regeln zu schreiben, die mit allen Geräten übereinstimmen sollten. Ich habe eine neue Datei hinzugefügt /etc/udev/rules.d/notify.rules:

ACTION=="add",    RUN+="/bin/bash /home/dimon/tmp/device_plug.sh"
ACTION=="remove", RUN+="/bin/bash /home/dimon/tmp/device_unplug.sh"

Und zwei Skripte:

device_plug.sh:

#!/bin/bash

export DISPLAY=":0"
notify-send "device plugged"

/usr/bin/play -q /path/to/plug_sound.wav &

device_unplug.sh:

#!/bin/bash

export DISPLAY=":0"
notify-send "device unplugged"

/usr/bin/play -q /path/to/unplug_sound.wav &

Es funktioniert, aber es funktioniert sehr dumm. Meine Fragen sind:

  1. Wie bekomme ich den aktuellen Titel des Geräts angehängt, den ich auch in der lsusbAusgabe sehen kann? Derzeit habe ich nur Benachrichtigungen wie "plugged" und "unpugged" erhalten, und ich kann nicht finden, wie ich den Namen des Geräts in meiner udev - Regel abrufen kann Parameter)
  2. Derzeit sind zu viele Benachrichtigungen aktiviert. Sprich, als ich meinen USB-Stick anschloss, bekam ich ungefähr 15 Benachrichtigungen! Wenn ich aber laufe lsusb, wird der angeschlossene USB-Stick nur als einzelnes Gerät angezeigt. Es scheint also, dass ich dem Regelfilter ein weiteres Argument hinzufügen sollte, aber ich kann es nicht herausfinden.
  3. Möglicherweise gibt es eine bessere Lösung für Benachrichtigungen über das Ein- und Ausstecken von Geräten? Bitte schlagen Sie vor, wenn Sie etwas wissen.
Dmitry Frank
quelle

Antworten:

9

Nun, nach vielen Stunden des Googelns und Fragens in den Foren habe ich es zum Laufen gebracht (es scheint). Jeder, der eine nette visuelle und / oder akustische Benachrichtigung erhalten möchte, wenn ein USB-Gerät angeschlossen oder nicht angeschlossen ist, kann mein Skript installieren (siehe Installationsdetails unten).

Zunächst Antworten auf meine eigenen Fragen.

1. Wie bekomme ich den aktuellen Titel des Geräts angehängt, den ich auch in der lsusbAusgabe sehen kann?

Es gibt keine solchen Titel im Kernel (in der Regel). Es gibt eine Datenbankdatei mit Titeln für viele Paare vendor_id:product_id, normalerweise eine /usr/share/hwdata/usb.idsDatei. Diese Datenbank kann von aktualisiert werden /usr/sbin/update-usbids.sh. Vielen Dank an die Leute von linux.org.ru für diese Info.

Ich weiß nicht, ob es ein spezielles Tool gibt, um den Gerätetitel paarweise abzurufen vendor_id:product_id, also musste ich mich ein bisschen mit lsusbund hacken grep: zum Beispiellsusb | grep '0458:003a'

2. Derzeit sind zu viele Benachrichtigungen aktiviert. Sprich, als ich meinen USB-Stick anschloss, bekam ich ungefähr 15 Benachrichtigungen!

Ich muss zugeben, dass ich nicht herausgefunden habe, wie man Regeln dafür schreibt, aber ich habe einen anderen Weg gefunden, wie ich sie filtern kann.

udevermöglicht es uns , für einige Substitutionen zu verwenden RUN+="...": sagen wir, können wir den Bus Nummer und Gerätenummer erhalten $attr{busnum}und $attr{devnum}jeweils. Erstens speichere ich in meinem Skript eine Liste der angeschlossenen Geräte in der speziellen Datei, sodass keine Benachrichtigung generiert wird, wenn das Skript ein neues "Plug" -Ereignis erhält und die Bus- und Devnum-Werte dieses Geräts bereits in unserer Datei gespeichert sind. Und zweitens, diese Substitutionen $attr{busnum}und $attr{devnum}sind in der Regel nur für eines der Geräte aus der „Serie“ von Ereignissen. Erklärter Algorithmus sollte es aber auf jeden Fall aussortieren.


Aktuelle Projektseite: my-udev-notify .

Es sieht aus wie das:

Bildbeschreibung hier eingeben

Installationsdetails.

Getestet unter Linux Mint 13, sollte es unter Ubuntu und anderen Ubuntu-Derivaten funktionieren, und ich hoffe, es funktioniert auf jedem * nix-System mit udev.

  • Gehen Sie zur Projektseite , holen Sie sich die Quellen von dort und platzieren Sie sie irgendwo. Es gibt nur ein Hauptskript my-udev-notify.sh:, aber das Archiv enthält auch Sounds für Plug / Unplug-Benachrichtigungen sowie weitere Informationen (siehe readme.txtDetails).
  • Erstellen Sie eine Datei /etc/udev/rules.d/my-udev-notify.rulesmit folgendem Inhalt: (Vergessen Sie nicht, den Pfad in den Pfad zu ändern, in den Sie entpackt haben my-udev-notify.sh!)

 ACTION=="add",    RUN+="/bin/bash /path/to/my-udev-notify.sh -a add    -p '%p' -b '$attr{busnum}' -d '$attr{devnum}'"
 ACTION=="remove", RUN+="/bin/bash /path/to/my-udev-notify.sh -a remove -p '%p' -b '$attr{busnum}' -d '$attr{devnum}'"

Danach sollte es für neu angeschlossene Geräte funktionieren. Das heißt, wenn Sie ein Gerät vom Stromnetz trennen, erhalten Sie keine Benachrichtigung. Aber wenn Sie es wieder einstecken, werden Sie. (Ja, bei mir funktioniert es, ohne dass udev neu gestartet wird. Wenn dies nicht der Fall ist, versuchen Sie einen Neustart.)

Starten Sie einfach Ihr System neu, damit es für alle Geräte funktioniert. HINWEIS: Während des ersten Startvorgangs werden möglicherweise viele Benachrichtigungen angezeigt (siehe bekannte Probleme in der readme.txt). Beim zweiten Start werden keine Benachrichtigungen angezeigt (es sei denn, Sie schließen ein neues Gerät an, wenn das System ausgeschaltet ist.)

Sie können es anpassen (visuelle und akustische Benachrichtigungen aktivieren / deaktivieren oder Sounds ändern). Weitere Informationen finden Sie in der Datei readme.txt im Archiv.

Dmitry Frank
quelle
Vielleicht sollten Sie sich diese Frage / Antwort ansehen : stackoverflow.com/questions/469243/… Wird verwendet pyudev, um benachrichtigt zu werden, und erfordert keine zusätzlichen Skripte in /etc/udev.
Denilson Sá Maia
Sind Benachrichtigungen zum Ein- / Ausstecken des Geräts standardmäßig ausgeblendet oder nicht verfügbar?
Gonzobrains
1
@gonzobrains, nein, sobald Sie der Datei /etc/udeve/rules.d die richtigen Regeln hinzugefügt haben, sollte dies für neu angeschlossene Geräte funktionieren.
Dmitry Frank
@DmitryFrank Was ich meinte war, werden diese Benachrichtigungen standardmäßig automatisch angezeigt oder müssen Sie die obigen Schritte ausführen, um sie anzuzeigen? Für mein Projekt möchte ich sie unterdrücken (dh standardmäßig werden keine Benachrichtigungen angezeigt).
Gonzobrains
1
@gonzobrains, wenn Sie die obigen Schritte nicht ausgeführt haben und Benachrichtigungen angezeigt werden, wenn Sie ein Gerät anschließen oder entfernen, hat mein Skript nichts damit zu tun. Ein anderes Programm erledigt dies für Sie.
Dmitry Frank
0

Fügen Sie die folgenden Zeilen vor Ihre visuellen Benachrichtigungszeilen ein, um dem Skript eine Vorstellung davon zu geben, auf welcher X-Anzeige es die notify-send(oder eine andere X-Anwendung) ausführen soll :

export DISPLAY=:0
export XAUTHORITY=/var/lib/lightdm/.Xauthority

Natürlich müssen Sie die zweite Zeile entsprechend Ihrer Desktop-Umgebung (oder Ihrem Display-Manager) ändern. Diese Zeile funktioniert gut für Ubuntu 16.04, das Unity als Desktop und LightDM als Display Manager verwendet.

(aus diesem Beitrag )

MortezaE
quelle