1台のデスクトップPC上の複数のXサーバーから同時にスクリーンショットを撮りたい。
複数のXserverをtty1
(およびtty2
)で起動する複数のユーザーが異なる端末(tty3
、tty4
、startx /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
より遅いかもしれないと感じています。私が間違っている場合は私を訂正してください。
私は質問の問題を次のように理解しています:
テキストコンソールttyを使用しています、
したがって、スクリーンショットコマンドを実行しているttyでXが実行されていません。
Xディスプレイに対してコマンドラインスクリーンショットコマンドを実行できます。
あなたはXディスプレイを指定スクリーンショットコマンド用にDISPLAY=:2 scrot out.png
。
スクリーンショットコマンドはエラーを出さない
ただし、出力として黒い画像が表示されます。
問題は、Xサーバーが画像を画像バッファーにペイントしておらず、スクリーンショットがその空のバッファーから取得されていることである可能性があります。ただし、compiz
のように、ペイントされていないコンポジットウィンドウマネージャーである可能性もあります。少なくとも単一のウィンドウをキャプチャする場合は、それが問題になる可能性があります。 metacity
のようなコンポジットではないウィンドウマネージャーを使用する価値があると思います。
それでも解決しない場合は、まったく異なるアプローチがあります。
すべてのXサーバーを1つのディスプレイでネストされた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.
(Xvnc
はUbuntuではパッケージvnc4server
として利用可能です)
コマンドラインツール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
ImagMagickのimport
コマンドを使用して、同様のことを行うこともできます。
$ import -window root -display :0.0 -screen /tmp/0.png
または、コメントで@mikeservが示唆しているように、scrot
がアクティブなXディスプレイを正しく検出できるように$DISPLAY
を設定してみてください。
$ DISPLAY=:1 scrot 1.png
これは次のようにループする可能性があります。
$ for i in {1..4};do DISPLAY=:$i scrot $i.png; done