GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Notify-Send von einer Udev-Regel aufrufen?

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 sehr kurze Zeit (1-2 Minuten) und dann, wenn ich ein Gerät anschließe/trenne, stürzt es ab:

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 es entfernen. (auch Fehlerbericht eingereicht)

Überraschenderweise habe ich bisher keine ähnlichen Dienstprogramme gefunden. Dann habe ich versucht, udev-Regeln zu schreiben, die auf alle Geräte passen sollten. Ich habe die neue Datei /etc/udev/rules.d/notify.rules hinzugefügt :

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 angeschlossenen Geräts, so wie ich es in lsusb sehen kann Ausgang? Derzeit bekomme ich nur Benachrichtigungen wie „plugged“ und „unpugged“, und ich kann nicht finden, wie ich den Namen des Geräts in meiner udev-Regel abrufen kann (Wenn ich kann, würde ich ihn als Parameter)
  2. Aktuell sind zu viele Benachrichtigungen aktiviert. Sagen wir, wenn ich meinen USB-Stick anschließe, bekomme ich etwa 15 Benachrichtigungen! Aber wenn ich lsusb ausführe , angeschlossener USB-Stick wird 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. Wahrscheinlich gibt es eine bessere Lösung für Benachrichtigungen zum Ein- und Ausstecken von Geräten? Bitte schlagen Sie vor, wenn Sie etwas wissen.

Akzeptierte Antwort:

Nun, nach vielen Stunden des Googelns und Fragens in Foren habe ich es zum Laufen gebracht (scheint es). Jeder, der schöne visuelle und/oder akustische Benachrichtigungen erhalten möchte, wenn ein USB-Gerät eingesteckt/ausgesteckt wird, kann mein Skript installieren, siehe Installationsdetails unten.

Zunächst einmal Antworten auf meine eigenen Fragen.

1. Wie man den tatsächlichen Titel des angehängten Geräts erhält, das gleiche, wie ich in lsusb sehen kann Ausgabe?

Es gibt keine solchen Titel im Kernel (im allgemeinen Fall). Es gibt eine Datenbankdatei mit Titeln für viele Paare vendor_id:product_id , normalerweise /usr/share/hwdata/usb.ids Datei. Diese Datenbank kann mit /usr/sbin/update-usbids.sh aktualisiert werden . Danke an die Leute von linux.org.ru für diese Informationen.

Ich weiß nicht, ob es ein spezielles Tool zum Abrufen des Gerätetitels nach Paar vendor_id:product_id gibt , also musste ich ein bisschen mit lsusb hacken und grep :zum Beispiel lsusb | grep '0458:003a'

2. Derzeit sind zu viele Benachrichtigungen aktiviert. Sagen wir, wenn ich meinen USB-Stick anschließe, habe ich ungefähr 15 Benachrichtigungen bekommen!

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

udev ermöglicht es uns, einige Ersetzungen für RUN+="..." zu verwenden :Sagen wir, wir können Busnummer und Gerätenummer durch $attr{busnum} erhalten und $attr{devnum} bzw. 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 Busnum und Devnum dieses Geräts bereits in unserer Datei gespeichert sind. Und zweitens diese Ersetzungen $attr{busnum} und $attr{devnum} sind in der Regel nur für eines der Geräte aus der „Reihe“ von Ereignissen verfügbar. Aber wie auch immer, der erklärte Algorithmus sollte es auf jeden Fall klären.

Verwandte:Debian – Verbindung zum Internet auf einem VPN-verbundenen Server ohne Internet?

Aktuelle Projektseite:my-udev-notify.

Es sieht so aus:

Installationsdetails.

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

  • Gehen Sie zur Projektseite, holen Sie sich Quellen von dort und legen Sie sie irgendwo ab. Es enthält nur ein Hauptskript:my-udev-notify.sh , aber das Archiv enthält auch Sounds für Plug-/Unplug-Benachrichtigungen sowie einige weitere Informationen, siehe readme.txt für Details.
  • Erstellen Sie die Datei /etc/udev/rules.d/my-udev-notify.rules mit folgendem Inhalt:(Vergessen Sie nicht, den Pfad in Ihren tatsächlichen Pfad zu ändern, in dem Sie my-udev-notify.sh entpackt haben !)
 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 ausstecken, erhalten Sie keine Benachrichtigung. Aber wenn Sie es wieder anschließen, werden Sie es tun.
(Ja, bei mir funktioniert es ohne Neustart von udev. Wenn es bei Ihnen nicht funktioniert, versuchen Sie es mit einem
Neustart)

Damit es für alle Geräte funktioniert, starten Sie einfach Ihr System neu. BEACHTEN SIE, dass beim ersten Start möglicherweise
viele Benachrichtigungen angezeigt werden (siehe bekannte Probleme in der readme.txt ). Beim zweiten
Start gibt es keine Benachrichtigungen (es sei denn, Sie schließen ein neues Gerät an, während das System
ausgeschaltet ist)

Sie können es anpassen (visuelle und akustische Benachrichtigungen ein-/ausschalten oder Töne ändern). Einzelheiten finden Sie in der readme.txt im Archiv.


Linux
  1. Wie führt man eine HTTP-Anfrage/einen Aufruf mit JSON-Nutzlast von der Befehlszeile aus?

  2. Rufen Sie das Python-Skript von bash mit Argument auf

  3. Rufen Sie eine Userspace-Funktion innerhalb eines Linux-Kernel-Moduls auf

  4. Rufen Sie eine C-Funktion aus C++-Code auf

  5. Wie kann man Eingaben von verschiedenen Tastaturen unterscheiden?

Senden Sie Desktop-Benachrichtigungen und Erinnerungen vom Linux-Terminal

Multifaktor-Authentifizierung über das MyRackspace-Portal

Multifaktor-Authentifizierung aus dem Cloud Control Panel

So senden Sie Desktop-Benachrichtigungen unter Ubuntu mit Benachrichtigung senden

Vom df-Gerätenamen zum Namen des physischen Laufwerks (Hersteller / Typ)

Gibt es Alternativen zur Verwendung von `udev`?