Ich habe einen Daemon, der in Bash implementiert ist und mit Hilfe cron
der @reboot
Option 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 xprintidle
und wmctrl
fehlschlä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 grep
Zeile 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 crontab
Zeile:
@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.
lightdm