Lösung 1:
Hier ist eine Möglichkeit, eine Liste der getrennten xrdp-Sitzungen zu erhalten. Es beruht auf der Tatsache, dass die xrdp Server ist bei normaler Verwendung des X-Session-Managers der einzige Client, der eine TCP-Verbindung zum Xvnc aufbaut X Window System-Anzeigeserver. Wenn eine xrdp-Sitzung aktiv ist, hat der zugeordnete Xvnc-Anzeigeserver zwei TCP-Verbindungen, eine im ESTABLISHED-Zustand und die andere im LISTEN-Zustand. Das sieht mit lsof(1) etwa so aus Programm.
$ sudo lsof -b -w -n -c /^Xvnc$/b -a -iTCP:5900-5999
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
Xvnc 1625 guest 1u IPv4 252910 0t0 TCP 127.0.0.1:5910 (LISTEN)
Xvnc 1625 guest 9u IPv4 261226 0t0 TCP 127.0.0.1:5910->127.0.0.1:35242 (ESTABLISHED)
Wenn der Benutzer der Remote-Sitzung diese durch Schließen der RDP-Verbindung (oder im Fall einer Apache Guacamole RDP-Sitzung durch Schließen des Browserfensters) abbricht, sieht das ungefähr so aus:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
Xvnc 1625 guest 1u IPv4 252910 0t0 TCP 127.0.0.1:5910 (LISTEN)
Beachten Sie, dass auf diesem getrennten Xvnc-Anzeigeserverprozess keine ESTABLISHED-Verbindung besteht. Jeder Xvnc-Prozess, der nur zuhört, ist also eine getrennte Sitzung.
Hier ist ein Shell-Skript (mit dem Namen lsdisconnected
), die die PID und den BENUTZER für jede getrennte Remotesitzung anzeigt. Es verwendet lsof(1) und gawk(1) um die Verbindungslogik zu implementieren.
#!/bin/bash
sudo lsof -FRgpLT -b -w -n -c /^Xvnc$/b -a -iTCP:5900-5999 |
gawk '
match($0,/^p([0-9]+)/, p) {pid = p[1]; pids[pid]=0; } ;
match($0,/^L([A-Za-z0-9]+)/, p) {user[pid] = p[1]; } ;
/TST=LISTEN/ {pids[pid] = pids[pid] - 1 ;};
/TST=ESTABLISHED/{pids[pid] = pids[pid] + 1};
END {
for (pid in pids){
if (pids[pid] < 0) {
print pid, user[pid];
}
}};
'
Dies ist eine praktische Methode, um getrennte Remote-Desktop-Sitzungen zu finden. Es funktioniert sofort nach der Trennung, ohne dass eine Leerlaufzeit verwendet werden muss.
Für diejenigen, die mit lsof(1) nicht vertraut sind Hier ist eine Erklärung der Kommandozeilenparameter in diesem Beispiel.
-b -w
vermeidet lsof-Kernelwartezeiten. Sie werden hier nicht benötigt.-n
vermeidet DNS-Lookups für Hostnamen.-c /^Xvnc$/b
sucht mithilfe einer Regex nach Prozessen mit dem genauen Befehlsnamen Xvnc.-a
weist lsof an, beim Filtern UND und nicht ODER zu verwenden.-iTCP:5900-5999
filtert nach TCP-Ports mit den Nummern 5900 - 5999, die für X-Anzeigeverbindungen verwendet werden.)
Lösung 2:
Ich habe endlich eine Lösung dafür gefunden.
Zuerst musste ich ein kleines Programm namens xprintidle
installieren :
sudo apt-get install xprintidle
Danach habe ich ein kleines Bash-Skript geschrieben, das zuerst alle von Xvnc und xrdp verwendeten Displays abruft und dann diese Display-Sessions überprüft, ob sie länger als eine Anzahl von Minuten inaktiv waren:
#!/bin/bash
displays=`ps aux | grep Xvnc | grep -v 'grep\|sed' | sed -r 's|.*(Xvnc :[0-9]*).*|\1|' | cut -d' ' -f 2`
limit=180
date
echo "Checking for inactive sessions!"
while read -r d; do
export DISPLAY=$d
idle=`xprintidle`
idleMins=$(($idle/1000/60))
if [[ $idleMins -gt $limit ]]; then
echo "WARN Display $d is logged in for longer than ${limit}min (${idleMins}m)"
else
echo "INFO Display $d is still ok (${idleMins}m)"
fi
done <<< "$displays"