web-dev-qa-db-ja.com

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

1台のデスクトップPC上の複数のXサーバーから同時にスクリーンショットを撮りたい。

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

そのデスクトップにはモニターが1つだけあります。

これらのXサーバーのそれぞれについて、できればscrotを使用してスクリーンショットを撮りたいのですが、現在、試してみると黒/空白の画像が表示されます。そのXサーバーでアクティブになっている場合にのみ、適切なスクリーンショットが表示されます。

たとえば、Ctrl+Alt+F8を使用してscrot test.pngを実行すると、適切なスクリーンショットが表示されます。正しく理解していれば、$DISPLAYを設定する必要はありません。これは、Ctrl+Alt+F8を使用しているため、echo $DISPLAY> :1を取得するためです。しかし、sleep 10; scrot test.pngを実行してCtrl+Alt+F7に移動すると、黒い画像が表示されます。

これらの端末のそれぞれから同時に複数のスクリーンショットを取得するにはどうすればよいですか?

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

将来の参考のために、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

~/.Xsessionで、Xserver/client(ブラックボックス付き)とXephyr(openbox付き)を次のように起動します。

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

「最終的な」ウィンドウマネージャーをopenbox-sessionにしたい。 Xserverとopenboxの両方にXephyrを使用したいのですが、exec openbox & DISPLAY=:11 /usr/bin/openbox-sessionがクラッシュしますが、exec openbox & DISPLAY=:11 /usr/bin/openboxはクラッシュしません。

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

XVncを試しませんでしたが、Xephyrより遅いかもしれないと感じています。私が間違っている場合は私を訂正してください。

6
Konstantinos

私は質問の問題を次のように理解しています:

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

  • Xディスプレイに対してコマンドラインスクリーンショットコマンドを実行できます。

  • あなたはXディス​​プレイを指定スクリーンショットコマンド用に
    DISPLAY=:2 scrot out.png

  • スクリーンショットコマンドはエラーを出さない


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


問題は、Xサーバーが画像を画像バッファーにペイントしておらず、スクリーンショットがその空のバッファーから取得されていることである可能性があります。ただし、compizのように、ペイントされていないコンポジットウィンドウマネージャーである可能性もあります。少なくとも単一のウィンドウをキャプチャする場合は、それが問題になる可能性があります。 metacityのようなコンポジットではないウィンドウマネージャーを使用する価値があると思います。

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

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

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

から 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.

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

3
Volker Siegel

方法#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ファイルは、特殊なタイプのXWindowsダンプファイルです。

$ 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が示唆しているように、scrotがアクティブなXディスプレイを正しく検出できるように$DISPLAYを設定してみてください。

$ DISPLAY=:1 scrot 1.png

これは次のようにループする可能性があります。

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

参考文献

6
slm