Xorg

來自多個 Xserver 的螢幕截圖

  • August 22, 2014

我想在一台台式 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.pngCtrl+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. 我想同時使用openboxXserver 和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似乎是最新的。還有較舊的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

方法 #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

參考

引用自:https://unix.stackexchange.com/questions/151277