ubuntuusers.de

udev-Regel: Programm starten auf grafischer Oberfläche möglich?

Status: Ungelöst | Ubuntu-Version: Ubuntu 12.04 (Precise Pangolin)
Antworten |

MannMitHut

Avatar von MannMitHut

Anmeldungsdatum:
22. Juni 2010

Beiträge: 806

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!

MannMitHut

(Themenstarter)
Avatar von MannMitHut

Anmeldungsdatum:
22. Juni 2010

Beiträge: 806

Nachtrag/Ergänzung:

Dasselbe kann ich durchspielen, wenn ich die gewünschten Befehle als normaler User, anstatt als root, laufen lasse (was bei meinem Szenario auch sinnvoll sein wird). Dazu lasse ich den udev-Befehl nicht direkt mein Backup-Skript aufrufen, sondern dieses "Zwischenstück":

1
2
3
#!/bin/sh
# /usr/local/bin/backup_user
su -c /usr/local/bin/backup <username>

So läuft dann mein eigentliches Befehlsscript (s.o.) als normaler User <username>, und damit auch die enthaltenen Befehle.

Das Bild bleibt dasselbe:

  • backup_user, direkt in einem grafischen Terminal gestartet, lässt alle drei Befehle wunschgemäß ablaufen.

  • backup_user, über die udev-Regel gestartet, lässt den Log-Befehl (1.) richtig laufen, hingegen scheitern Zenity-Nachricht und Start des grafischen Tools (2. + 3.).

MannMitHut

(Themenstarter)
Avatar von MannMitHut

Anmeldungsdatum:
22. Juni 2010

Beiträge: 806

aaaaaaaaaaahhh!!!

Jetzt hab ich was gefunden, es ist ähnlich wie bei cron, vgl.

http://wiki.ubuntuusers.de/Cron#Fenster-einer-Anwendung-oeffnet-sich-nicht, vgl. auch

http://forum.ubuntuusers.de/topic/anacron-script-startet-nicht/

Ich muss also Zenity wie mein grafisches Tool mit DISPLAY=:0 und LANG=de_DE.UTF-8 starten. Anstatt jedem Befehl einzeln diese Anweisungen voranzustellen, rufe ich elegant schon mein ganzes Befehlsscript damit auf, also:

1
2
3
#!/bin/sh
# /usr/local/bin/backup_user
DISPLAY=:0 LANG=de_DE.UTF-8 su -c /usr/local/bin/backup <username>

Wär das also geklärt. Was ein Monolog bis jetzt ... 😳

Bleibt allerdings die Frage übrig, ob und wie man prüfen könnte, ob der betreffende User auch gerade grafisch eingloggt ist.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Wenn es nur um "überhaupt eigeloggt" ginge, würde die Ausgabe von users ja reichen ...
Aber Du fragst ja ausdrücklich nach "graphisch eingeloggt".

Andererseits sieht man in der Ausgabe von cat /var/run/utmp auch deutlich, dass dort neben dem Usernamen auch der zugehörige Bildschirm mit drin steht. - Jetzt müsste man nur noch herausbekommen, mit welchem Tool man bequem an diese Info kommt.

Edit: Das Wiki nennt in diesem Zusammenhang den Befehl who, und der gibt auch die jeweilige Konsole mit aus.

LG,

track

rbuunk88

Anmeldungsdatum:
30. Juli 2012

Beiträge: Zähle...

forum.ubuntuusers.de/topic/anacron-script-startet-nicht/#post-5332127 Hab dir jetzt mal oben geantwortet.

Du könntest auch die Ausgabe von who auf den Benutzer testen und dann abfragen:

1
2
s=`who | grep user`
test "$s" -n && weitermachen

Also wenn der angemeldete Nutzer online ist gehts weiter. Dann müsstest du nur noch die Display Variable rausfiltern.

anrub

Avatar von anrub

Anmeldungsdatum:
4. Januar 2013

Beiträge: 336

Wenn du immer ":0" als DISPLAY verwendest, kannst du vorher die Ausgabe von who nach :0 greppen, um sicherzustellen, dass dieses DISPLAY existiert.

1
2
displayExists=`who|grep :0`
test -n "$displayExists" && startBackupScript.sh

Grüße, anrub

Antworten |