
Ich habe einen Daemon, der in Bash implementiert ist und über cron
die @reboot
Option 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 xprintidle
und wmctrl
der 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 grep
Zeile 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 crontab
Zeile:
@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 logind
Dienst abzufragen. Es verfügt über org.freedesktop.login1.Manager
eine Schnittstelle mit mehreren Signalen wie SessionNew
und SeatNew
. org.freedesktop.login1.Seat
und org.freedesktop.login1.User
Schnittstellen. Es kann helfen, den Sitzungs-/Sitz-/Benutzerstatus abzurufen.
Antwort2
Verwenden Sie das Startskript für die Anmeldesitzung, ~/.xprofile
um eine Flag-Datei für Sie zu erstellen. Verwenden Sie ~/.xlogin_flag
dann in Ihrem anderen Skript inotifywatch
from package inotify-tools
, um zu sehen, wie es erstellt, bearbeitet oder gelöscht wird.
Antwort3
Überprüfen Sie die Ausgabe des w
Befehls. 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