Como inicio o Xvfb na inicialização do Debian?

9

Eu tenho um servidor web Debian que estou usando para raspagem de tela ocasional via Selenum e Python.

Eu uso o Xvfb como um servidor X virtual para o Firefox rodar ao ser controlado pelo Selenium. Dado que eu (acho) tenho que começar esse uso sudo, não acho que seja possível iniciá-lo a partir do Python todas as vezes (veja minha pergunta do Stack Overflow ), então achei que poderia fazê-lo funcionar o tempo todo .

Atualmente, inicio-o assim na linha de comando:

sudo Xvfb :99 -nolisten tcp -fbdir /var/run

Que método devo usar para fazer isso automaticamente na inicialização? Devo usar cron, como sugerido aqui ?

Paul D. Waite
fonte

Respostas:

6

No debian, você pode adicionar o comando Xvfb ao /etc/rc.local. Se o Xvfb não se desanexar em segundo plano, use um &no final do comando.

O uso do cron também funcionaria, embora os scripts init lhe dêem mais controle sobre exatamente quando, na sequência de inicialização, ele será executado, e são a maneira tradicional de iniciar serviços.

Andy
fonte
Ah, excelente. A edição é /etc/rc.localpreferível a usar update-rc.dcom os próprios scripts individuais?
Paul D. Waite
2
@Paul, eu diria que update-rc.dé o preferido e certamente é mais capaz, mas rc.localé mais rápido e fácil. Além disso, acho que Gilles está certo, não há razão para isso precisar ser executado como root.
Andy
4

Sua premissa é inválida: não há razão para executar o Xvfb como root. Seu servidor X habitual só precisa ser executado como root (em muitos, mas não em todos os), apenas para que ele possa acessar o hardware de vídeo; isso não é um problema para o Xvfb por definição.

Se você deseja executar o Xvfb na inicialização, pode usar o cron @rebootsubstituindo os cinco campos de data e hora. Você pode fazer isso no crontab de qualquer usuário, não apenas no root. Mas não vejo o ponto. Seus scripts seriam mais robustos se você iniciasse o Xvfb quando necessário, da maneira que parece ter planejado originalmente.

Gilles 'SO- parar de ser mau'
fonte
Ponto válido. Para executar o Xvfb para apenas um comando, você pode usar o xvfb-runcomando que geralmente acompanha o Xvfb. Aqui está a referência cli para xvfb-run manpages.debian.org/stretch/xvfb/xvfb-run.1.en.html . @ Paul você pode executá-lo da seguinte forma:xvfb-run --server-args="-nolisten tcp -fbdir /var/run" python some-selenium.py
sebisnow
4

Como o @Gilles sugeriu, é mais adequado executar sob demanda, especialmente quando você o usa para testes de selênio. Aqui está um exemplo de comandos do shell:

export DISPLAY=:99
xdpyinfo -display $DISPLAY > /dev/null || Xvfb $DISPLAY -screen 0 1024x768x16 &

Verificar a exibição usando xdpyinfoantes garantirá que você não execute o buffer de quadros virtual duas vezes.


Se você realmente precisar iniciá-lo na inicialização, tente o seguinte script init.d :

#!/bin/sh
XVFB=/usr/bin/Xvfb
XVFBARGS=":1 -screen 0 1024x768x24 -ac +extension GLX +render -noreset -nolisten tcp"
PIDFILE=/var/run/xvfb.pid
case "$1" in
  start)
    echo -n "Starting virtual X frame buffer: Xvfb"
    start-stop-daemon --start --quiet --pidfile $PIDFILE --make-pidfile --background --exec $XVFB -- $XVFBARGS
    echo "."
    ;;
  stop)
    echo -n "Stopping virtual X frame buffer: Xvfb"
    start-stop-daemon --stop --quiet --pidfile $PIDFILE
    echo "."
    ;;
  restart)
    $0 stop
    $0 start
    ;;
  *)
        echo "Usage: /etc/init.d/xvfb {start|stop|restart}"
        exit 1
esac

exit 0

Fonte: dloman / xvfb no GitHub (bifurcado em: jterrace / xvfb )

Salve-o como /etc/init.d/xvfbe torne-o executável; em seguida, inicie-o como:

/etc/init.d/xvfb start

Para executar automaticamente na inicialização, execute:

sudo update-rc.d xvfb defaults

Para removê-lo da execução automática, execute:

sudo update-rc.d -f xvfb remove

Adicione também o environmentarquivo a ser reconhecido pelos programas X, por exemplo:

echo DISPLAY=":1" | sudo tee -a /etc/environment

Aqui está a versão da versão do systemd: dloman / xvfb.service .

kenorb
fonte
Eu sei que este é um ano de idade, mas parece que não consigo obter uma versão javascript selenium para trabalhar com isso. Se eu executar após a inicialização, ele funciona, mas quando eu o inicio como um serviço, é como se ele não detectasse o xvfb. Alguma idéia de como posso fazer com que ambos trabalhem como serviços no início?
Masinde Muliro
@MasindeMuliro Você pode fazer outra pergunta então, para que as respostas possam ser mais atualizadas e específicas do seu problema.
kenorb