再起動するまでVNCを使用できない恐ろしい黒い画面を修正するx11vnc
起動スクリプトを作成中です。これまでのところ、最新の/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
を削除して、サーバーをリロードし、接続のたびに新しい表示構成を提供するようにしたことです。
正しいXCookieファイルを見つけるには:0
や:1
などの現在のディスプレイと、適切なモニター画像を表示するための正しい出力が必要です。 。
すべてのアップデートでKubuntu18.04で実行されます。
現在のLinuxvtで実行されているXorgサーバーの表示番号(Xvfb
またはxnest
なし)を見つけたい場合は、おそらくこれで十分です(@basinの コメント)を完了します )
pgrep -at "$(cat /sys/class/tty/tty0/active)" Xorg | grep -Po ' \K:[0-9]+'
Pgrepの-t tty
オプションは、制御端末としてtty
を持つプロセスを選択し、-a
オプションはコマンドライン全体を印刷するように指示します。 2番目のgrepは、そこから表示番号を抽出します。
もちろん、ユーザーがCtrl-Alt-Fnを介してテキストコンソールに切り替えた場合、それは何も印刷しません。
私はついにそれを理解しました。ビリーおじさんに私を正しい方向に向けてくれた小道具(彼の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ファイルのフルパスが含まれている必要があります。ここで、ビリーおじさんの提案が出てきます。pgrep
行の出力には表示番号はありませんが、GUIDスタイルのX-cookieはあります。これは、括弧で囲まれた16進文字列内のハイフンの正確な位置を考慮せずに大まかにgrep
するものです。
cnt
変数には表示番号が含まれている必要があります。 X-cookie自体からそれを抽出します。 cat -v
は、バイナリ文字をキャレットエスケープされた制御文字に変換します。次に、これらの2進数を、X-cookieファイルの表示番号を囲むものと照合します。 [A-C]{1}
部分は、実際には表示番号の長さフィールドです。 Aは1文字、Bは2文字などを意味します。これを意図したとおりに解析することはできませんが、幸いなことに、使用される正規表現はそれなしで解析できます。したがって、スクリプトは最大999の表示をサポートします。
欠点の1つは、異なるシステムでは、^@
で表される長さゼロの文字列が、このスクリプトを壊して入力される可能性があることです。誰かがもっとうまくやるべきことを知っているなら、私に教えてください。
また、X-cookieが一部のシステムに存在しないため、このスクリプトの普遍性が低下するため、X-cookieから抽出せずに表示番号を検出したいと思います。