我想同时从一台台式电脑上的多个 X 服务器上截取屏幕截图。
我有多个用户登录不同的终端(tty1
、tty2
、tty3
、 ),他们分别使用( 和、)tty4
启动多个 Xserver 。这样我就可以使用, , ,访问它们中的每一个。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
。我想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
似乎是最新的。还有较旧的Xnest
和Xvfb
:
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