Jak uruchomić Xvfb podczas uruchamiania na Debianie?

9

Mam serwer WWW Debiana, którego używam do sporadycznego zgarniania ekranu przez Selenum i Python.

Używam Xvfb jako wirtualnego serwera X dla Firefoksa do uruchamiania, gdy jest kontrolowany przez Selenium. Biorąc pod uwagę, że (myślę), że muszę zacząć to używać sudo, nie sądzę, że będzie to możliwe, aby uruchomić go za każdym razem za pomocą Pythona (patrz moje pytanie dotyczące przepełnienia stosu ), więc pomyślałem, że mogę po prostu cały czas go uruchamiać .

Obecnie zaczynam tak w wierszu poleceń:

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

Jakiej metody należy użyć, aby zrobić to automatycznie podczas uruchamiania? Czy powinienem używać cron, jak sugerowano tutaj ?

Paul D. Waite
źródło

Odpowiedzi:

6

W Debianie możesz dodać polecenie Xvfb /etc/rc.local. Jeśli Xvfb nie odłączy się w tle, użyj znaku &na końcu polecenia.

Korzystanie z crona też by działało, chociaż skrypty inicjujące dają ci większą kontrolę nad tym, kiedy dokładnie w sekwencji uruchamiania będzie działać i są tradycyjnym sposobem uruchamiania usług.

Andy
źródło
Aha, świetnie. Czy edytowanie jest lepsze /etc/rc.localniż używanie update-rc.dwłasnych skryptów?
Paul D. Waite,
2
@Paul Powiedziałbym, że update-rc.djest preferowany i na pewno jest bardziej zdolny, ale rc.localjest szybszy i łatwiejszy. Poza tym uważam, że Gilles ma rację, nie ma powodu, aby działał jako root.
Andy,
4

Twoja przesłanka jest nieprawidłowa: nie ma powodu, aby uruchamiać Xvfb jako root. Twój zwykły serwer X musi działać tylko jako root (na wielu, ale nie wszystkich jednorożcach) tylko po to, aby mógł uzyskać dostęp do sprzętu wideo; z definicji nie stanowi to problemu dla Xvfb.

Jeśli chcesz uruchomić Xvfb podczas uruchamiania, możesz użyć crona z @rebootzastąpieniem pięciu pól daty i godziny. Możesz to zrobić w crontabie dowolnego użytkownika, nie tylko root. Ale nie widzę sensu. Twoje skrypty byłyby bardziej niezawodne, gdybyś uruchomił Xvfb, gdy go potrzebujesz, dokładnie tak, jak początkowo planowałeś.

Gilles „SO- przestań być zły”
źródło
Ważny punkt Aby uruchomić Xvfb tylko dla jednego polecenia, możesz użyć xvfb-runpolecenia, które zwykle jest dostarczane z Xvfb. Oto odniesienie cli do xvfb-run manpages.debian.org/stretch/xvfb/xvfb-run.1.en.html . @Paul, możesz uruchomić go w następujący sposób:xvfb-run --server-args="-nolisten tcp -fbdir /var/run" python some-selenium.py
sebisnow 30.01.2019
4

Jak sugeruje @Gilles , bardziej nadaje się do uruchamiania na żądanie, szczególnie gdy używasz go do testowania Selenium. Oto przykładowe polecenia powłoki:

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

Sprawdzanie wyświetlania za pomocą xdpyinfowcześniej pozwoli uniknąć dwukrotnego uruchomienia wirtualnego bufora ramki.


Jeśli naprawdę musisz go uruchomić podczas uruchamiania, możesz wypróbować następujący skrypt 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

Źródło: dloman / xvfb w GitHub (rozwidlone z: jterrace / xvfb )

Zapisz jako /etc/init.d/xvfbi ustaw, aby był wykonywalny, a następnie uruchom go jako:

/etc/init.d/xvfb start

Aby automatycznie uruchomić przy uruchomieniu, uruchom:

sudo update-rc.d xvfb defaults

Aby usunąć go z automatycznego uruchamiania, uruchom:

sudo update-rc.d -f xvfb remove

Dodaj również do environmentpliku, który ma być rozpoznawany przez programy X, np .:

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

Oto wersja dla wersji systemd : dloman / xvfb.service .

kenorb
źródło
Wiem, że jest to roczek, ale wydaje się, że nie mogę uzyskać wersji selenowej javascript do pracy z tym. Jeśli uruchomię się po uruchomieniu, to działa, ale kiedy uruchamiam go jako usługę, to tak, jakby nie wykrywał xvfb. Masz pomysł, jak mogę obu uruchomić na początku jako usługi?
Masinde Muliro,
@MasindeMuliro Możesz wtedy zadać inne pytanie, aby odpowiedzi były bardziej aktualne, aby były dostosowane do Twojego problemu.
kenorb