Capturas de tela de vários Xservers

5

Eu quero fazer capturas de tela simultaneamente de vários servidores X em um PC de mesa.

Tenho vários usuários conectados em terminais diferentes ( tty1 , tty2 , tty3 , tty4 ) que iniciam vários Xservers com startx /usr/bin/openbox-session -- :1 (e :2 , :3 , :4 respectivamente ). Assim, posso acessar cada um deles com Ctrl+Alt+F8 , +F9 , +F10 , +F11 .

Existe apenas um monitor nessa área de trabalho.

Eu quero fazer capturas de tela para cada um desses servidores X, de preferência com scrot , mas atualmente recebo uma imagem em preto-e-branco sempre que eu a tento. Somente quando estou ativo no servidor X, recebo uma captura de tela apropriada.

Por exemplo, se eu estiver em Ctrl+Alt+F8 e executar scrot test.png , obtenho uma captura de tela apropriada; se bem entendi eu não tenho que definir o $DISPLAY , pois estando em Ctrl+Alt+F8 eu recebo echo $DISPLAY > %código%. Mas se eu executar :1 e ir para sleep 10; scrot test.png , obtenho uma imagem em preto.

Como posso obter várias capturas de tela de cada um desses terminais simultaneamente?

O que funcionou para mim foi Ctrl+Alt+F7 . O único problema com esta solução parece ser que quando eu executo comandos Xephyr extremamente rápidos, ele não é tão responsivo quanto o X.

Para referência futura, o que fiz para cada um dos quatro usuários e terminais foi:

Em xdotool , eu defino cada usuário para login automático após a inicialização do meu sistema, como:

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

Em ~/.profile , inicio um Xserver / client (com blackbox) e Xephyr (com openbox) como:

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

Eu quero que o gerenciador de janelas "final" seja ~/.Xsession . Eu gostaria de usar openbox-session para o Xserver e openbox , mas Xephyr falha, enquanto exec openbox & DISPLAY=:11 /usr/bin/openbox-session não.

Dessa forma, o usuário em exec openbox & DISPLAY=:11 /usr/bin/openbox pode tirar screenshots, enquanto o monitor mostra :11 . (ou :0 , :13 , etc.).

Eu não tentei :14 , mas tenho a sensação de que pode ser mais lento que XVnc ; por favor me corrija se eu estiver errado.

    
por Konstantinos 21.08.2014 / 02:20

2 respostas

2

Eu entendo o problema na pergunta da seguinte forma:

  • Você está em um console de texto tty ,
    então não há X rodando no tty onde você está rodando o comando screenshot.

  • Você pode executar os comandos da linha de comando da tela de comando para as exibições do X.

  • Você especificou o X exibe para os comandos de captura de tela, como em DISPLAY=:2 scrot out.png .

  • O comando de captura de tela não apresenta um erro


Mas você obtém uma imagem em preto como saída .


O problema pode ser que o servidor X não esteja pintando a imagem em algum buffer de imagem, e a captura de tela é tirada desse buffer vazio. Mas também pode ser que seja um gerenciador de janelas de composição, como compiz , que não está pintando. Pelo menos se você capturar janelas únicas, esse poderia ser o problema. Eu acho que vale a pena tentar usar um gerenciador de janelas não composto, como metacity .

Se isso não resolver, há uma abordagem completamente diferente:

Execute todos os seus servidores X como servidores X aninhados em um único monitor. Cada servidor X aninhado mostra sua saída de tela em uma janela. Você pode, então, fazer capturas de tela em tela inteira da exibição aninhada ou capturas de tela da janela na tela principal.

Como implementação de um servidor X aninhado, Xephyr parece ser o mais atual. Há também os antigos Xnest e Xvfb :

De 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.

De maneira semelhante, o Xvnc (do pacote vnc4server) pode ser usado, fornecendo acesso adicionalmente pelo protocolo VNC:

De 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 está disponível como pacote vnc4server no Ubuntu)

    
por 21.08.2014 / 02:33
5

Método 1 - Usando xwd

Você poderia simplesmente usar a ferramenta de linha de comando xwd para pegar o X como:

$ xwd -display :1 -root -out 1.xwd

Você pode passar de 1 a 4 da seguinte forma:

$ for i in {1..4};do xwd -display :$i -root $i.xwd; done

OBSERVAÇÃO: Os arquivos .xwd resultantes são um tipo especial de arquivo de despejo X Windows.

$ file 1.xwd 
1.xwd: XWD X Window Dump image data, "xwdump", 4160x1440x24

Você pode usar xwud para exibi-los assim:

$ xwud -in 1.xwd

Ou você pode usar o comando display do ImageMagick para visualizá-los:

$ display 1.xwd

Método 2 - Usando a importação

Você também pode usar o comando import do ImagMagick para fazer algo semelhante:

$ import -window root -display :0.0 -screen /tmp/0.png

Método # 3 - usando scrot

Ou, como sugerido por @mikeserv nos comentários, tente definir o $DISPLAY para que scrot consiga encontrar o monitor X ativo corretamente:

$ DISPLAY=:1 scrot 1.png

Isso pode ser feito em loop da seguinte forma:

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

Referências

por 21.08.2014 / 08:56