¿Cómo inicio Xvfb al inicio en Debian?

9

Tengo un servidor web Debian que estoy usando para el raspado ocasional de pantalla a través de Selenum y Python.

Uso Xvfb como un servidor X virtual para que Firefox se ejecute cuando se controla mediante Selenium. Dado que (creo) que tengo que comenzar a usar esto sudo, no creo que sea factible iniciarlo desde Python cada vez (vea mi pregunta de Desbordamiento de pila ), así que pensé que podría hacerlo funcionar todo el tiempo .

Actualmente lo inicio así en la línea de comando:

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

¿Qué método debo usar para hacer esto automáticamente al inicio? ¿Debo usar cron, como se sugiere aquí ?

Paul D. Waite
fuente

Respuestas:

6

En debian, puede agregar el comando Xvfb a /etc/rc.local. Si Xvfb no se separa en el fondo, use un &al final del comando.

El uso de cron también funcionaría, aunque los scripts de inicio le dan más control sobre exactamente cuándo se ejecutará en la secuencia de inicio, y son la forma tradicional de iniciar servicios.

Andy
fuente
Ajá, excelente. ¿Se /etc/rc.localprefiere la edición al uso update-rc.dcon los propios guiones individuales?
Paul D. Waite
2
@Paul diría que update-rc.des preferido y ciertamente es más capaz, pero rc.locales más rápido y fácil. Además, creo que Gilles tiene razón, no hay razón para que esto deba ejecutarse como root.
Andy
4

Su premisa no es válida: no hay ninguna razón para ejecutar Xvfb como root. Su servidor X habitual solo necesita ejecutarse como root (en muchos, pero no en todos), para que pueda acceder al hardware de video; eso no es un problema para Xvfb por definición.

Si desea ejecutar Xvfb al inicio, puede usar cron @rebootreemplazando los cinco campos de fecha y hora. Puede hacerlo en el crontab de cualquier usuario, no solo en la raíz. Pero no veo el punto. Sus scripts serían más sólidos si iniciara Xvfb cuando lo necesita, tal como parece haberlo planeado originalmente.

Gilles 'SO- deja de ser malvado'
fuente
Punto valido. Para ejecutar Xvfb solo para un comando, puede usar el xvfb-runcomando que generalmente se envía con Xvfb. Aquí está la referencia de cli para xvfb-run manpages.debian.org/stretch/xvfb/xvfb-run.1.en.html . @Paul podrías ejecutarlo de la siguiente manera:xvfb-run --server-args="-nolisten tcp -fbdir /var/run" python some-selenium.py
sebisnow
4

Como sugirió @Gilles , es más adecuado para ejecutar bajo demanda, especialmente cuando lo está utilizando para las pruebas de selenio. Aquí hay ejemplos de comandos de shell:

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

Si comprueba la pantalla usando xdpyinfoantes, se asegurará de que no ejecutará framebuffer virtual dos veces.


Si realmente necesita iniciarlo al inicio, puede probar el siguiente 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

Fuente: dloman / xvfb en GitHub (bifurcado de: jterrace / xvfb )

Guárdelo /etc/init.d/xvfby hágalo ejecutable, luego inícielo como:

/etc/init.d/xvfb start

Para ejecutarse automáticamente al inicio, ejecute:

sudo update-rc.d xvfb defaults

Para eliminarlo de la ejecución automática, ejecute:

sudo update-rc.d -f xvfb remove

También agregue al environmentarchivo para ser reconocido por los programas X, por ejemplo:

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

Aquí está la versión para la versión systemd: dloman / xvfb.service .

kenorb
fuente
Sé que esto tiene un año pero parece que no puedo obtener una versión de javascript selenio para trabajar con esto. Si ejecuto después del arranque, funciona, pero cuando lo inicio como un servicio es como si no detectara xvfb. ¿Alguna idea de cómo puedo hacer que ambos funcionen como servicios al inicio?
Masinde Muliro
@MasindeMuliro Puede hacer otra pregunta entonces, para que las respuestas se puedan actualizar más para que sean específicas para su problema.
kenorb