解決策 1:
切断された xrdp セッションのリストを取得する方法を次に示します。 xrdp という事実に依存しています サーバーは、通常の X セッション マネージャーの使用法では、Xvnc への TCP 接続を確立する唯一のクライアントです。 X Window System ディスプレイ サーバー。 xrdp セッションがアクティブな場合、関連する Xvnc ディスプレイ サーバーには 2 つの TCP 接続があり、1 つは ESTABLISHED 状態で、もう 1 つは LISTEN 状態です。 lsof(1) を使用すると、次のようになります。 プログラム。
$ 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)
リモート セッションのユーザーが RDP 接続を閉じることによって (または、Apache Guacamole RDP セッションの場合はブラウザー ウィンドウを閉じることによって) セッションを放棄した場合、次のようになります。
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 ディスプレイ サーバー プロセスには ESTABLISHED 接続がないことに注意してください。そのため、リッスンするだけの Xvnc プロセスは切断されたセッションです。
これがシェル スクリプトです (名前は lsdisconnected
) には、切断された各リモート セッションの PID と USER が表示されます。 lsof(1) を使用します および gawk(1) 接続ロジックを実装します。
#!/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];
}
}};
'
これは、切断されたリモート デスクトップ セッションを見つける便利な方法です。アイドル時間を使用する必要なく、切断後すぐに動作します。
lsof(1) に慣れていない人向け この例のコマンド ライン パラメータの説明は次のとおりです。
-b -w
lsof カーネル待機を回避します。ここでは必要ありません。-n
ホスト名の DNS ルックアップを回避します。-c /^Xvnc$/b
正規表現を使用して、正確なコマンド名 Xvnc を持つプロセスを探します。-a
フィルタリング時に OR ではなく AND を使用するように lsof に指示します。-iTCP:5900-5999
X ディスプレイ接続に使用される 5900 ~ 5999 の TCP ポートでフィルタします。)
解決策 2:
私は最終的にこれに対する解決策を見つけました。
まず、xprintidle
という小さなプログラムをインストールする必要がありました。 :
sudo apt-get install xprintidle
その後、最初に Xvnc と xrdp で使用されるすべてのディスプレイをフェッチし、次にそれらのディスプレイ セッションが数分以上アイドル状態になっているかどうかをチェックする小さな bash スクリプトを作成しました。
#!/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"