多个Xservers的屏幕截图

Modified on: Sat, 30 Jun 2018 11:22:30 +0800

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

我有多个用户登录不同的终端(tty1tty2tty3tty4)多个Xservers与startx /usr/bin/openbox-session -- :1(和:2:3:4分别)。所以我可以用Ctrl+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。我想对Xserver和openbox使用Xephyr,但exec openbox & DISPLAY=:11 /usr/bin/openbox-session崩溃,而exec openbox & DISPLAY=:11 /usr/bin/openbox没有。

这样,:11中的用户可以截屏,而显示器显示:0。 (或:13:14等)。

我没有尝试XVnc,但我觉得它可能比Xephyr慢;如果我错了,请纠正我。

作者:,pidosaurus

最佳答案

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

  • 您位于文本控制台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.

Xvnc在Ubuntu中作为包vnc4server提供)


相关问答

添加新评论