Wie starte ich Xvfb beim Start unter Debian?

9

Ich habe einen Debian-Webserver, den ich für gelegentliches Screen-Scraping über Selenum und Python verwende.

Ich verwende Xvfb als virtuellen X-Server, auf dem Firefox ausgeführt werden kann, wenn es von Selenium gesteuert wird. Angesichts der Tatsache, dass ich (denke), dass ich damit beginnen sudomuss, denke ich nicht, dass es möglich ist, es jedes Mal von Python aus zu starten (siehe meine Frage zum Stapelüberlauf ), also dachte ich mir, ich könnte es einfach die ganze Zeit laufen lassen .

Ich starte es derzeit so in der Kommandozeile:

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

Welche Methode sollte ich verwenden, um dies beim Start automatisch zu tun? Soll ich verwenden cron, wie hier vorgeschlagen ?

Paul D. Waite
quelle

Antworten:

6

Unter Debian können Sie den Befehl Xvfb hinzufügen /etc/rc.local. Wenn sich Xvfb nicht in den Hintergrund löst, verwenden Sie ein &am Ende des Befehls.

Die Verwendung von cron würde auch funktionieren, obwohl Init-Skripte Ihnen mehr Kontrolle darüber geben, wann sie in der Startsequenz ausgeführt werden, und die traditionelle Methode zum Starten von Diensten sind.

Andy
quelle
Aha, ausgezeichnet. Ist die Bearbeitung /etc/rc.localder Verwendung update-rc.dmit eigenen Skripten vorzuziehen ?
Paul D. Waite
2
@Paul würde ich sagen, update-rc.dist bevorzugt und sicherlich leistungsfähiger, aber rc.localschneller und einfacher. Ich denke auch, dass Gilles Recht hat. Es gibt keinen Grund, warum dies als Root ausgeführt werden muss.
Andy
4

Ihre Prämisse ist ungültig: Es gibt keinen Grund, Xvfb als Root auszuführen. Ihr üblicher X-Server muss nur als Root (auf vielen, aber nicht allen Unices) ausgeführt werden, damit er auf die Videohardware zugreifen kann. Das ist per Definition kein Problem für Xvfb.

Wenn Sie Xvfb beim Start ausführen möchten, können Sie cron verwenden @reboot, um die fünf Datums- und Uhrzeitfelder zu ersetzen. Sie können dies in der Crontab eines jeden Benutzers tun, nicht nur in der Root. Aber ich verstehe den Punkt nicht. Ihre Skripte wären robuster, wenn Sie Xvfb bei Bedarf starten würden, genau so, wie Sie es ursprünglich geplant zu haben scheinen.

Gilles 'SO - hör auf böse zu sein'
quelle
Gutes Argument. Um Xvfb nur für einen Befehl auszuführen, können Sie den xvfb-runBefehl verwenden, der normalerweise mit Xvfb geliefert wird. Hier ist die CLI-Referenz für xvfb-run manpages.debian.org/stretch/xvfb/xvfb-run.1.en.html . @ Paul Sie könnten es wie folgt xvfb-run --server-args="-nolisten tcp -fbdir /var/run" python some-selenium.py
ausführen
4

Wie von @Gilles vorgeschlagen, ist es besser geeignet, bei Bedarf ausgeführt zu werden, insbesondere wenn Sie es für Selentests verwenden. Hier sind Beispiel-Shell-Befehle:

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

Wenn Sie die Anzeige mit "Vorheriges" überprüfen, xdpyinfowird sichergestellt, dass Sie den virtuellen Framebuffer nicht zweimal ausführen.


Wenn Sie es beim Start wirklich starten müssen, können Sie das folgende init.d- Skript ausprobieren :

#!/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

Quelle: dloman / xvfb bei GitHub (gegabelt von: jterrace / xvfb )

Speichern Sie es als /etc/init.d/xvfbund machen Sie es ausführbar, dann starten Sie es als:

/etc/init.d/xvfb start

Führen Sie Folgendes aus, um beim Start automatisch ausgeführt zu werden:

sudo update-rc.d xvfb defaults

Führen Sie Folgendes aus, um es aus dem Autorun zu entfernen:

sudo update-rc.d -f xvfb remove

Fügen Sie auch eine environmentDatei hinzu, die von X-Programmen erkannt werden soll, z.

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

Hier ist die Version für die systemd-Version: dloman / xvfb.service .

Kenorb
quelle
Ich weiß, dass dies ein Jahr alt ist, aber ich kann anscheinend keine Javascript-Selen-Version bekommen, um damit zu arbeiten. Wenn ich es nach dem Booten starte, funktioniert es, aber wenn ich es als Dienst starte, erkennt es xvfb nicht. Irgendeine Idee, wie ich beide dazu bringen kann, beim Start als Dienste zu arbeiten?
Masinde Muliro
@MasindeMuliro Sie können dann eine andere Frage stellen, damit die Antworten aktualisiert werden können, um spezifisch für Ihr Problem zu sein.
Kenorb