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
Antworten:
Versuchen Sie, mit D-Bus Sitzungsinformationen vom
logind
Dienst abzufragen . Es hatorg.freedesktop.login1.Manager
Schnittstelle mit mehreren Signalen wieSessionNew
undSeatNew
.org.freedesktop.login1.Seat
undorg.freedesktop.login1.User
Schnittstellen. Es kann hilfreich sein, den Sitzungs- / Sitz- / Benutzerstatus abzurufen.quelle
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 Skriptinotifywatch
aus dem Paket, uminotify-tools
zu sehen, wie es erstellt, berührt oder gelöscht wird.quelle
Überprüfen Sie die Ausgabe des
w
Befehls. Der Anmeldetyp (X-Anzeige) wird im Feld LOGIN @ angezeigt.quelle
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-errors
da bei der grafischen Anmeldung alles, was Sie stderr verwenden, dorthin umgeleitet wird.Verwenden Sie andernfalls einfach den
w
Befehl, wie bereits von @Grzegorz vorgeschlagen: Wenn dieFROM
Spalte mit beginnt, handelt:
es sich um eine grafische Sitzung.quelle
Überprüfen Sie das Laufzeitverzeichnis von lightdm. Wenn sich ein Benutzer auf Arch mit systemd und lightdm anmeldet, wird eine xauthority-Datei erstellt.
Sie können dies mit so etwas in Ihrer while-Schleife testen.
quelle