Hallo zusammen!
Ich bin an einer Backup-Automation in Verbindung mit USB-HDDs am basteln und frage mich, ob man über eine udev-Regel ein Script so starten kann, dass es auch auf die laufende grafische Oberfläche zugreifen kann, etwa um Meldungen (z.B. mit Zenity) auszugeben oder um grafische (Backup-)Programme zu starten.
Mal der Reihe nach, folgendes Szenario:
Ich habe ein kleines Test-Script, das in eine Log-Datei schreibt (1.), eine Bildschirm-Meldung (Zenity) ausgibt (2.) und ein grafisches (!) Backup-Programm startet (3.):
1 2 3 4 5 6 7 8 9 10 11 12 | #!/bin/sh ## /usr/local/bin/backup ## Script zur Datensicherung echo $(date) >> ~/backup_log.txt # (1.) hängt eine Zeile mit aktuellem Datum an eine Datei an (zu Testzwecken) zenity --info --text "Sicherung startet!" # (2.) Info-Box unter grafischer Oberfläche (etwa Gnome) /usr/bin/luckybackup # (3.) grafisches (!) Backup-Programm |
Lasse ich dieses Script aus einem Terminal unter einer GUI laufen, funktionieren alle drei Befehle, also auch die Zenity-Meldung und das Starten des grafischen Backup-Tools (ob als normaler User oder als root). Mittels einer udev-Regel fange ich nun das Einschalten einer USB-Festplatte ab, dabei nutze ich die UUID einer Partition um eine eindeutige Gerätekennung zu erzeugen (Symlink); mit RUN+= veranlasse ich die Ausführung des obigen Scripts:
## /etc/udev/rules.d/75-usb-storage-custom.rules ## Regel zum kontrollierten Reagieren auf den Neuanschluss einer USB-Festplatte SUBSYSTEMS=="usb",ACTION=="add",ENV{ID_FS_UUID}=="<UIDD_einer_HDD>",SYMLINK+="<Mountpunkt>",RUN+="/usr/local/bin/backup"
Beim einschalten der HDD wird der Symlink korrekt hergestellt (lässt sich nebenbei auch zum Mounten nutzen, hier nur weggelassen). Auch das Script wird wie gewünscht angestoßen, erkennbar daran, dass die Log-Datei beschrieben wird (erster Befehl im Script). Es wird aber sowohl die Zenity-Meldung nicht angezeigt, als auch das grafische Backup-Programm nicht gestartet (auch mit anderen grafischen Programmen getestet).
Klar: Die udev-Regel startet ihren Befehl "im Hintergrund" und nicht "auf der grafischen Oberfläche" (Gnome).
Gibt es dennoch eine Möglichkeit,
das über die udev-Regel angestoßene Script "auf der grafischen Oberfläche" laufen zu lassen
und dazu vielleicht auch erst mal abzufragen, ob der betreffende Nutzer gerade auf einer GUI eingeloggt ist?
Herzlichen Dank für Hinweise!