Wie kann anhand eines Skripts erkannt werden, wann der Desktop des Benutzers geladen wird?

Wie kann anhand eines Skripts erkannt werden, wann der Desktop des Benutzers geladen wird?

Ich habe einen Daemon, der in Bash implementiert ist und über crondie @rebootOption läuft, den Desktop bei Inaktivität anzuzeigen. Das Skript sieht wie folgt aus (die Zeitangaben 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 wmctrlder Desktop noch nicht geladen ist, schlägt dies fehl. Um dies zu vermeiden, habe ich die folgenden Zeilen ganz an den Anfang des Skripts gesetzt:

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

Das Skript wartet also, bis der Benutzer angemeldet ist (die Variable USER ist auf meinen Benutzernamen in der Crontab-Datei gesetzt). Wenn ein Benutzer jedoch 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, in der der „Desktopmodus angezeigt“ werden kann oder nicht? Und wie kann ich darüber hinaus sicherstellen, dass eine „grafische“ Sitzung vollständig geladen ist und sich nicht gerade im Ladevorgang befindet oder ähnliches?

Meine Lösung: Meine (informelle) Lösung besteht darin, in der Hauptschleife die folgende grepZeile hinzuzufügen:

WAIT_TIME=180

while:
do
    sleep $WAIT_TIME

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

    ## My actions here
done

Das Ziel ist "$WM_CMD".Windows-Manager-BefehlIch gehe davon aus, dass, wenn dieWindows-Manager-Befehlim System ausgeführt wird, bedeutet dies, dass der Desktop vollständig geladen ist und alle „grafischen“ Befehle ausgeführt werden können.

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

Ich denke aber auch, dass es möglich wäre, den "Windows Manager-Befehl" anhand anderer Systemanfragen zu erkennen. Mir reicht es allerdings, WM_CMD in der Crontab-Datei zu definieren.

Antwort1

Versuchen Sie, D-Bus zu verwenden, um Sitzungsinformationen vom logindDienst abzufragen. Es verfügt über org.freedesktop.login1.Managereine Schnittstelle mit mehreren Signalen wie SessionNewund SeatNew. org.freedesktop.login1.Seatund org.freedesktop.login1.UserSchnittstellen. Es kann helfen, den Sitzungs-/Sitz-/Benutzerstatus abzurufen.

Antwort2

Verwenden Sie das Startskript für die Anmeldesitzung, ~/.xprofileum eine Flag-Datei für Sie zu erstellen. Verwenden Sie ~/.xlogin_flagdann in Ihrem anderen Skript inotifywatchfrom package inotify-tools, um zu sehen, wie es erstellt, bearbeitet oder gelöscht wird.

Antwort3

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

Antwort4

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

$ 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önnten dies mit so etwas in Ihrer While-Schleife testen.

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

verwandte Informationen