来自多个 Xserver 的屏幕截图

来自多个 Xserver 的屏幕截图

我想同时从一台台式电脑上的多个 X 服务器上截取屏幕截图。

我有多个用户登录不同的终端(tty1tty2tty3、 ),他们分别使用( 和、)tty4启动多个 Xserver 。这样我就可以使用, , ,访问它们中的每一个。startx /usr/bin/openbox-session -- :1:2:3:4Ctrl+Alt+F8+F9+F10+F11

该桌面上只有一台显示器。

我想为每个 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。

为了供将来参考,我对四个用户和终端中的每一个所做的操作是:

在 中~/.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(带有 blackbox)和 Xephyr(带有 openbox),如下所示:

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

我希望“最终”窗口管理器是openbox-session。我想openbox同时使用 Xserver 和Xephyr,但 exec openbox & DISPLAY=:11 /usr/bin/openbox-session会崩溃,而exec openbox & DISPLAY=:11 /usr/bin/openbox 不会。

这样,用户:11可以截取屏幕截图,同时显示器显示:0。 (或:13:14等)。

我没有尝试XVnc,但我有一种感觉,它可能会慢于Xephyr;如果我错了,请纠正我。

答案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 在评论中的建议,尝试设置$DISPLAY以便scrot可以正确找到活动的 X 显示:

$ DISPLAY=:1 scrot 1.png

这可以像这样循环:

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

参考

答案2

我对问题中的问题的理解如下:

  • 你在一个文本控制台 tty
    因此您运行屏幕截图命令的 tty 上没有运行 X。

  • 你可以运行命令行截图X 显示的命令。

  • 你有指定 X 显示对于屏幕截图命令,如
    DISPLAY=:2 scrot out.png.

  • 屏幕截图命令的作用是不会给你一个错误


但是你会得到一个黑色图像作为输出


问题可能是 X 服务器没有将图像绘制到某个图像缓冲区中,并且屏幕截图是从该空缓冲区中获取的。但它也可能是一个合成窗口管理器,例如compiz,它不是绘画。至少如果您捕获单个窗口,这可能是问题所在。我认为值得尝试使用非合成窗口管理器,例如metacity.

如果这不能解决问题,还有一种完全不同的方法:

在一台显示器上将所有 X 服务器作为嵌套 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.

(在 Ubuntu 中Xvnc作为包提供)vnc4server

相关内容