來自多個 Xserver 的螢幕截圖
我想在一台台式 PC 上同時從多個 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
; 如果我錯了,請糾正我。
我理解問題中的問題如下:
- 您在文本控制台 tty上,
因此在您執行 screenshot 命令的 tty 上沒有執行 X。
- 您可以為 X 顯示器執行命令行螢幕截圖命令。
- 您已經為螢幕截圖命令指定了 X 顯示,例如在
DISPLAY=:2 scrot out.png
.
- 螢幕截圖命令不會給您錯誤
但是你得到一個黑色圖像作為輸出。
問題可能是 X 伺服器沒有將圖像繪製到某個圖像緩衝區中,並且螢幕截圖是從那個空緩衝區中獲取的。但也可能是它是一個合成視窗管理器,例如
compiz
,不是繪畫。至少如果您擷取單個視窗,那可能就是問題所在。我認為值得嘗試使用非合成視窗管理器,例如metacity
.如果這不能解決問題,則有一種完全不同的方法:
在一台顯示器上將所有 X 伺服器作為嵌套 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.
(在 Ubuntu 中
Xvnc
作為軟體包提供)vnc4server
方法 #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
參考