現在の物理モニターを使用するか、アクティブな仮想端末で実行されているXサーバーのディスプレイ番号をどのように見つけることができますか?

現在の物理モニターを使用するか、アクティブな仮想端末で実行されているXサーバーのディスプレイ番号をどのように見つけることができますか?

x11vnc再起動するまでVNCを無効にする恐ろしい黒い画面を修正する起動スクリプトを作成しています。これまでに、最新の/run/sddm/*ファイルを使用して次に変更して:0解決策を見つけました。n-1そのファイルがあります。ただし、これは推測にすぎず、ユーザーの切り替えが最後にディスプレイセッションを追加してから削除した場合にのみ機能します。最後のプロジェクトではなくプロジェクトに切り替えると、どのモニタを使用しているのかわからなくなり、問題が再び発生します。これまでの進捗状況:

#!/bin/sh

while true; do
lso=`ls -t /run/sddm/{* | grep -m1 -`
cnt=$((`ls /run/sddm/{* | grep -c -`-1))
/usr/bin/x11vnc -auth $lso -once -noxdamage -repeat -rfbauth /home/USER/.vnc/passwd -rfbport 5900 -shared -display :$cnt
usleep 400000
done

最も重要なのは、これを削除し、-foreverサーバー-loopを再ロードして接続するたびに新しいディスプレイ構成を提供することです。

:0たとえば、正しいX Cookieファイル(ディスプレイ番号がわかっている場合はこれを行うことができます)を見つけるには現在のディスプレイが必要です。正しいモニターの画像を:1表示するには正しい出力が必要です。

すべてのアップデートを含むKubuntu 18.04で実行されます。

答え1

Xvfb現在Linux vt(noまたは)で実行されているXorgサーバーの表示番号を見つけるには、xnest次のようにします(@basinの要件を満たす)。コメント)

pgrep -at "$(cat /sys/class/tty/tty0/active)" Xorg | grep -Po ' \K:[0-9]+'

-t ttypgrepオプションは制御端末を持つプロセスを選択し、ttyこの-aオプションはコマンドライン全体を印刷するように指示します。 2番目のgrepはプロセスからディスプレイ番号を抽出します。

もちろん、ユーザーがCtrl-Alt-Fnを介してテキストコンソールに切り替えると、何も印刷されません。

答え2

私はついにそれを見つけた。私に正しい方向を教えてくれたBillyおじさんに感謝します(彼の2番目の編集はまだ私には適していませんが)。

#!/bin/sh

while true; do
lso=/run/sddm/`pgrep -at "$(cat /sys/class/tty/tty0/active)" Xorg | grep -Po '\{[0-9a-f\-]{36}\}'`
cnt=`cat -v $lso | grep -Po '\^[A-C]{1}[0-9]{1,3}\^@\^RMIT' | grep -Po '[0-9]{1,3}'`
/usr/bin/x11vnc -auth $lso -once -noxdamage -repeat -rfbauth /home/USER/.vnc/passwd -rfbport 5900 -display :$cnt
usleep 400000
done

仕組みは次のとおりです。変数にはlso現在のX-Cookieファイルへのフルパスを含める必要があります。これがビリーおじさんのアドバイスが役に立つところです。数値は出力行には表示されませんが、pgrepGUID スタイル X Cookie は表示されます。そのため、grep括弧で囲まれた16進文字列内のハイフンの正確な位置を大まかに考慮しませんでした。

このcnt変数にはディスプレイ番号を含める必要があります。 X-Cookie自体から抽出します。バイナリ文字をcat -vキャレットエスケープ制御文字に変換します。その後、このバイナリ文字をX-Cookieファイルの表示番号の周囲の文字と一致させました。この[A-C]{1}部分は実際に数値を表示する長さフィールドです。 Aは1文字を表し、Bは2文字を表します。期待どおりに解析することはできませんでしたが、幸いにも使用された正規表現ではこれを要求しません。したがって、スクリプトは最大999個のモニターをサポートしているため、これで十分です。

1つの欠点は、他のシステムで表示される長さがゼロの文字列が原因で^@このスクリプトが破損する可能性があることです。より良い方法を知っている人がいれば教えてください。

また、一部のシステムにはX Cookieが存在しないため、このスクリプトの使用率が低下するため、X Cookieから抽出せずに表示番号を検出することをお勧めします。

関連情報