複数のXserverのスクリーンショット

複数のXserverのスクリーンショット

デスクトップコンピュータの複数のXサーバーで同時にスクリーンショットを撮りたいです。

tty1複数のユーザーが異なる端末(、、、、tty2tty3にログインしており、それらはtty4それぞれ(および、)を使用して複数のXserverを起動します。このようにして、、を使用してそれぞれにアクセスできます。startx /usr/bin/openbox-session -- :1:2:3:4Ctrl+Alt+F8+F9+F10+F11

このデスクトップにはモニターが1つしかありません。

可能であれば、を使用して各Xサーバーのスクリーンショットを撮りたいのですが、scrot現在試しているたびに黒/空の画像が表示されます。そのXサーバーで活動している場合にのみ正しいスクリーンショットを取得できます。

たとえば、開いてCtrl+Alt+F8実行すると正しいスクリーンショットが得られます。正しく理解したら、>を取得した後にscrot test.png設定する必要はありません。しかし、走っていくと黒い画像が現れます。$DISPLAYCtrl+Alt+F8echo $DISPLAY:1sleep 10; scrot test.pngCtrl+Alt+F7

各端末で同時に複数のスクリーンショットを撮るには?

私にとって有益なのは、このソリューションの唯一の問題は、非常に高速なコマンドを実行してもXほど速く応答しないことXephyrです。xdotool

後で参照できるように、4人のユーザーと端末のそれぞれに対して私が行ったことは次のとおりです。

では、~/.profileシステムの起動後に各ユーザーが自動的にログインするように設定しました。たとえば、次のようになります。

if [[ -z $DISPLAY ]] && [[ $(tty) = /dev/tty1 ]]; then
     sleep 30 # for some reason it crashes if I do not let 
              # it sleep for a while, not necessarily so long. 
              # I guess it has to do with my "normal" X at DISPLAY=:0 . 
              # Thus for tty2 I let it sleep 40 seconds, 
              # for tty3 50 seconds and so on.
     startx
fi

私はXserver / client(ブラックボックスを含む)とXepyr(オープンボックスを~/.Xsession含む)を次のように始めました。

Xephyr -fullscreen -screen 1920x1200 :11 &
exec blackbox & 
sleep 3 # Perhaps sleeping is redundant.
DISPLAY=:11 /usr/bin/openbox-session

私が望むのは「最終」ウィンドウマネージャですopenbox-sessionopenboxXserverとXserverを同時に使用したいのですが、Xephyr動作 exec openbox & DISPLAY=:11 /usr/bin/openbox-sessionが中断されexec openbox & DISPLAY=:11 /usr/bin/openbox 動作しません。

これにより、ユーザーは:11モニターに表示されている間にスクリーンショットを撮ることができます:0。 (または:13など:14)。

私はそれを試していませんがXVncXephyr私が間違っている場合は訂正してください。

答え1

方法#1 - xwdを使用する

コマンドラインツールを使用して、xwd次のようにXディスプレイをインポートできます。

$ xwd -display :1 -root -out 1.xwd

次のように1から4まで繰り返すことができます。

$ for i in {1..4};do xwd -display :$i -root $i.xwd; done

メモ:結果.xwdファイルは特別な種類のX Windowsダンプファイルです。

$ file 1.xwd 
1.xwd: XWD X Window Dump image data, "xwdump", 4160x1440x24

xwud次のように表示できます。

$ xwud -in 1.xwd

あるいは、ImageMagickのdisplayコマンドを使用して表示することもできます。

$ display 1.xwd

方法 #2 - インポートの使用

ImagMagickのimportコマンドを使用して同様の操作を実行することもできます。

$ import -window root -display :0.0 -screen /tmp/0.png

方法#3 - scrotの使用

または、@mikeservがコメントで提案したようにActive Xディスプレイを正しく見つけることができる$DISPLAYように設定してください。scrot

$ DISPLAY=:1 scrot 1.png

これは次のように繰り返すことができます。

$ for i in {1..4};do DISPLAY=:$i scrot $i.png; done

引用する

答え2

質問の質問の私の理解は次のとおりです。

  • あなたはテキストコンソールttyしたがって、
    Xはスクリーンショットコマンドを実行しているttyで実行されていません。

  • あなたは実行することができますコマンドラインスクリーンショットXを押すとコマンドが表示されます。

  • あなたは表示するにはXを指定してください。などのスクリーンショットコマンドの場合
    DISPLAY=:2 scrot out.png

  • スクリーンショットコマンドが実行するアクションは次のとおりです。あなたにエラーを与えないでしょう


ただし、出力として黒い画像が表示されます。


問題は、Xサーバーが一部のイメージバッファにイメージを描画せずに、その空のバッファからスクリーンショットを取得することです。ただし、たとえば、compizペイントではなく複合ウィンドウマネージャーとすることもできます。少なくとも単一のウィンドウをキャプチャする場合、これは問題かもしれません。私は合成されていないウィンドウマネージャを使ってみる価値があると思いますmetacity

それでも問題が解決しない場合は、まったく異なるアプローチがあります。

1台のモニターで、すべてのXサーバーをネストされたXサーバーとして実行します。ネストされた各Xサーバーはウィンドウに画面出力を表示します。ネストされたディスプレイのフルスクリーンスクリーンショットを作成するか、メインディスプレイのウィンドウスクリーンショットを作成できます。

ネストされたXサーバー実装としてXephyr最新のようです。より古いXnestものもありますXvfb

~からman Xephyr:

 NAME
        Xephyr - X server outputting to a window on a pre-existing X display

 DESCRIPTION
        Xephyr  is a kdrive server that outputs to a window on a pre-existing "host" X dis‐
        play.  Think Xnest but with support for modern extensions  like  composite,  damage
        and randr.

        Unlike  Xnest  which is an X proxy, i.e.  limited to the capabilities of the host X
        server, Xephyr is a real X server which uses the host X server  window  as  "frame‐
        buffer" via fast SHM XImages.

同様に、Xvnc(vnc4serverパッケージにあります)を使用して、VNCプロトコルを介した追加のアクセスを提供できます。

~からXvnc4:

 NAME
        Xvnc - the X VNC server

 DESCRIPTION
        Xvnc  is the X VNC (Virtual Network Computing) server.  It is based on a standard X
        server, but it has a "virtual" screen rather than a physical one.   X  applications
        display  themselves  on  it  as if it were a normal X display, but they can only be
        accessed via a VNC viewer - see vncviewer(1).

        So Xvnc is really two servers in one. To the applications it is an X server, and to
        the  remote  VNC  users it is a VNC server. By convention we have arranged that the
        VNC server display number will be the same as the X server  display  number,  which
        means  you  can  use eg. snoopy:2 to refer to display 2 on machine "snoopy" in both
        the X world and the VNC world.

(UbuntuではXvncパッケージとして利用可能)vnc4server

関連情報