Solusi 1:
Berikut adalah cara untuk mendapatkan daftar sesi xrdp yang terputus. Itu bergantung pada fakta bahwa xrdp server, dalam penggunaan manajer sesi X normal, satu-satunya klien yang membuat koneksi TCP ke Xvnc Server tampilan Sistem X Window. Saat sesi xrdp aktif, server tampilan Xvnc terkait memiliki dua koneksi TCP, satu dalam status ESTABLISHED, dan yang lainnya dalam status DENGARKAN. Itu terlihat seperti ini menggunakan lsof(1) program.
$ 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)
Jika pengguna sesi jarak jauh mengabaikannya dengan menutup koneksi RDP (atau, dalam kasus sesi RDP Apache Guacamole, dengan menutup jendela browser) akan terlihat seperti ini:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
Xvnc 1625 guest 1u IPv4 252910 0t0 TCP 127.0.0.1:5910 (LISTEN)
Perhatikan tidak ada koneksi ESTABLISHED pada proses server tampilan Xvnc yang terputus ini. Jadi, setiap proses Xvnc yang hanya mendengarkan adalah sesi yang terputus.
Ini adalah skrip shell (bernama lsdisconnected
) yang menampilkan PID dan USER untuk setiap sesi jarak jauh yang terputus. Ia menggunakan lsof(1) dan melongo(1) untuk mengimplementasikan logika koneksi.
#!/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];
}
}};
'
Ini adalah cara praktis untuk menemukan sesi desktop jarak jauh yang terputus; itu bekerja segera setelah pemutusan, tanpa perlu menggunakan waktu idle.
Bagi mereka yang mungkin tidak familiar dengan lsof(1) inilah penjelasan tentang parameter baris perintah dalam contoh ini.
-b -w
menghindari lsof kernel menunggu. Mereka tidak dibutuhkan di sini.-n
menghindari pencarian DNS untuk nama host.-c /^Xvnc$/b
mencari proses dengan nama perintah yang tepat Xvnc, menggunakan regex.-a
memberitahu lsof untuk menggunakan DAN, bukan ATAU, saat memfilter.-iTCP:5900-5999
filter oleh port TCP bernomor 5900 - 5999, yang digunakan untuk koneksi tampilan X.)
Solusi 2:
Saya akhirnya menemukan solusi untuk ini.
Pertama-tama, saya harus memasang program kecil bernama xprintidle
:
sudo apt-get install xprintidle
Setelah itu saya menulis skrip bash kecil yang pertama-tama mengambil semua tampilan yang digunakan oleh Xvnc dan xrdp, lalu memeriksa sesi tampilan tersebut jika tidak digunakan selama lebih dari beberapa menit:
#!/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"