GNU/Linux >> Linux の 問題 >  >> Linux

切断された xrdp セッションを見つける方法は?

解決策 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"

Linux
  1. Linuxでファイルを見つける方法

  2. 検索コマンドの後にMvコマンドを統合する方法は?

  3. LinuxでデフォルトゲートウェイIPを見つける方法

  1. LinuxでFINDを使用する方法

  2. CentOS7にXRDPをインストールする方法

  3. 無線 LAN インターフェイスの速度を調べる方法は?

  1. サブディレクトリを凝縮する方法は?

  2. find でディレクトリを除外する方法。指図

  3. wlan0のステータスを見つける方法は?