Wie erkenne ich anhand eines Skripts, wann der Desktop des Benutzers geladen ist?

11

Ich habe einen Daemon, der in Bash implementiert ist und mit Hilfe cronder @rebootOption ausgeführt wird, die den Desktop inaktiv anzeigt. Das Skript sieht wie folgt aus (die Timings sind zu Testzwecken kurz):

#!/bin/bash
P_STATE=0
while :
do
    sleep 5
    if [ $P_STATE == 0 ]; then
         [ `xprintidle` -ge 25000 ] && P_STATE=1 && wmctrl -k on
    else
         [ `xprintidle` -le 25000 ] && P_STATE=0
done

Problem: Wenn sich ein Benutzer beispielsweise noch im Anmeldebildschirm befindet xprintidleund wmctrlfehlschlägt, da der Desktop noch nicht geladen ist. Um dies zu vermeiden, habe ich die nächsten Zeilen ganz am Anfang des Skripts eingefügt:

while:
do
    sleep 10s
    [ -n `who | grep "$USER"` ] && break
done

Das Skript wartet also darauf, dass der Benutzer (die USER-Variable wird in der crontab-Datei auf meinen Benutzernamen gesetzt) ​​protokolliert wird. Wenn ein Benutzer beispielsweise eine Terminalsitzung beginnt (und keine grafische Sitzung wie KDE oder GNOME), wird das Skript ebenfalls fortgesetzt.

Wie kann ich feststellen, ob sich ein Benutzer bereits in einer "grafischen" Sitzung befindet, die den "Desktop-Modus anzeigen" kann oder nicht? Und wie kann ich außerdem sicherstellen, dass eine "grafische" Sitzung vollständig geladen ist und nicht gerade geladen wird oder so etwas?

Meine Lösung: Meine (informelle) Lösung fügt in der Hauptschleife die folgende grepZeile hinzu:

WAIT_TIME=180

while:
do
    sleep $WAIT_TIME

    [ ! -n "`ps -ef | grep "$WM_CMD" | grep -v "grep"`" ] && continue

    ## My actions here
done

Als "$ WM_CMD" der Ziel- Windows-Manager-Befehl . Ich gehe davon aus, dass, wenn der Windows Manager-Befehl im System ausgeführt wird, der Desktop vollständig geladen ist und jeder "Grafik" -Befehl sicher ist.

Wo ist die Variable WM_CMD definiert? In der crontabZeile:

 @reboot DISPLAY=:0 WM_CMD=/usr/bin/gnome-shell exec script_path/myscript.sh &> /dev/null

Aber ich denke auch, dass es möglich wäre, den "Windows Manager-Befehl" anhand anderer Systemanforderungen zu erkennen. Für mich reicht es jedoch aus, WM_CMD in der crontab-Datei zu definieren.

Peregring-lk
quelle
Welchen Login Manager verwenden Sie?
Mtahmed
Mein Login Manager istlightdm
Peregring-lk
Diese Super User-Frage könnte Ihnen helfen. Ich bin mir nicht sicher, ob es Ihre Frage vollständig beantworten wird.
Rany Albeg Wein
1
Es ist nicht besonders robust, aber Sie könnten nach dem Gnome / KDE-Prozess
suchen
1
Sie sollten dokumentieren, was Sie als Antwort getan haben. es kann anderen helfen.
Jasonwryan

Antworten:

2

Versuchen Sie, mit D-Bus Sitzungsinformationen vom logindDienst abzufragen . Es hat org.freedesktop.login1.ManagerSchnittstelle mit mehreren Signalen wie SessionNewund SeatNew. org.freedesktop.login1.Seatund org.freedesktop.login1.UserSchnittstellen. Es kann hilfreich sein, den Sitzungs- / Sitz- / Benutzerstatus abzurufen.

verrückt
quelle
1

Verwenden Sie das Startskript für die Anmeldesitzung ~/.xprofile, um eine Flag-Datei für Sie zu erstellen. Sei es ~/.xlogin_flag, dann benutze es in deinem anderen Skript inotifywatchaus dem Paket, um inotify-toolszu sehen, wie es erstellt, berührt oder gelöscht wird.

Grzegorz Żur
quelle
1

Überprüfen Sie die Ausgabe des wBefehls. Der Anmeldetyp (X-Anzeige) wird im Feld LOGIN @ angezeigt.

Grzegorz Żur
quelle
1

Ich denke, der einfachste Weg, um zu überprüfen, ob ein Benutzer in X11 verbunden ist, besteht darin, nach Prozessen zu suchen, in die geschrieben wird, $HOME/.xsession-errorsda bei der grafischen Anmeldung alles, was Sie stderr verwenden, dorthin umgeleitet wird.

Verwenden Sie andernfalls einfach den wBefehl, wie bereits von @Grzegorz vorgeschlagen: Wenn die FROMSpalte mit beginnt, handelt :es sich um eine grafische Sitzung.

eppesuig
quelle
0

Überprüfen Sie das Laufzeitverzeichnis von lightdm. Wenn sich ein Benutzer auf Arch mit systemd und lightdm anmeldet, wird eine xauthority-Datei erstellt.

$ whoami
carl
$ sudo ls -al /run/lightdm/carl
total 4
drwx------ 2 carl    carl     60 Dec 11 19:40 .
drwx--x--x 8 lightdm lightdm 160 Dec 11 19:40 ..
-rw------- 1 carl    carl     55 Dec 11 19:40 xauthority

Sie können dies mit so etwas in Ihrer while-Schleife testen.

[[ -f /run/lightdm/${USER}/xauthority ]] && continue
Carlwgeorge
quelle