Come posso avviare Xvfb all'avvio su Debian?


9

Ho un web server Debian che sto usando per lo screen-scraping occasionale tramite Selenum e Python.

Uso Xvfb come server X virtuale per Firefox per essere eseguito quando sono controllato da Selenium. Dato che (penso) devo iniziare a usarlo sudo, non penso che sarà possibile avviarlo da Python ogni volta (vedi la mia domanda Stack Overflow ), quindi ho pensato che avrei potuto farlo funzionare tutto il tempo .

Attualmente lo avvio in questo modo dalla riga di comando:

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

Quale metodo devo usare per farlo automaticamente all'avvio? Dovrei usare cron, come suggerito qui ?

Risposte:


6

Su debian, puoi aggiungere il comando Xvfb a /etc/rc.local. Se Xvfb non si stacca nello sfondo, usa un &alla fine del comando.

Anche l'uso di cron funzionerebbe, sebbene gli script di init ti diano più controllo esattamente quando verrà eseguito nella sequenza di avvio e sono il modo tradizionale di avviare i servizi.


Ah, eccellente. La modifica è /etc/rc.localpreferita all'utilizzo update-rc.dcon i propri script individuali?
Paul D. Waite,

2
@Paul Direi che update-rc.dè preferito ed è sicuramente più capace, ma rc.localè più veloce e più facile. Inoltre, penso che Gilles abbia ragione, non c'è motivo per cui debba essere eseguito come root.
Andy,

4

La tua premessa non è valida: non c'è motivo per eseguire Xvfb come root. Il tuo solito server X deve funzionare solo come root (su molti, ma non su tutti gli unices) solo per poter accedere all'hardware video; questo non è un problema per Xvfb per definizione.

Se si desidera eseguire Xvfb all'avvio, è possibile utilizzare cron con la @rebootsostituzione dei cinque campi di data e ora. Puoi farlo nel crontab di qualsiasi utente, non solo nel root. Ma non vedo il punto. I tuoi script sarebbero più robusti se avessi avviato Xvfb quando ne hai bisogno, proprio come sembra averlo pianificato originariamente.


Punto valido. Per eseguire Xvfb per un solo comando puoi usare il xvfb-runcomando che di solito viene fornito con Xvfb. Ecco il riferimento cli per xvfb-run manpages.debian.org/stretch/xvfb/xvfb-run.1.en.html . @Paul potresti eseguirlo come segue:xvfb-run --server-args="-nolisten tcp -fbdir /var/run" python some-selenium.py
sebisnow

4

Come suggerito da @Gilles , è più adatto per l'esecuzione su richiesta, soprattutto quando lo si utilizza per i test del selenio. Ecco alcuni comandi di shell di esempio:

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

Controllando il display usando xdpyinfoprima ti assicurerai che non eseguirai framebuffer virtuale due volte.


Se è davvero necessario avviarlo all'avvio, è possibile provare il seguente 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 su GitHub (biforcuta da: jterrace / xvfb )

Salvalo come /etc/init.d/xvfbe rendilo eseguibile, quindi avvialo come:

/etc/init.d/xvfb start

Per eseguire automaticamente all'avvio, eseguire:

sudo update-rc.d xvfb defaults

Per rimuoverlo dall'autorun, eseguire:

sudo update-rc.d -f xvfb remove

Aggiungi anche al environmentfile per essere riconosciuto dai programmi X, ad esempio:

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

Ecco la versione per la versione systemd: dloman / xvfb.service .


So che ha un anno ma non riesco a far funzionare una versione di selenio javascript con questo. Se corro dopo l'avvio funziona, ma quando lo avvio come servizio è come se non rilevasse xvfb. Hai idea di come posso fare in modo che entrambi funzionino come servizi all'avvio?
Masinde Muliro,

@MasindeMuliro Puoi fare un'altra domanda, quindi le risposte possono essere più aggiornate per essere specifiche del tuo problema.
Kenorb,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.