web-dev-qa-db-ja.com

Debianで起動時にXvfbを起動するにはどうすればよいですか?

私は、SelenumとPythonを介して時々画面をスクレイピングするために使用しているDebian Webサーバーを持っています。

私は、Seleniumによって制御されている場合に、Firefoxが実行される仮想XサーバーとしてXvfbを使用しています。私はSudoを使用してこれを開始する必要がある(考える)と考えると、Pythonから毎回開始するのは現実的ではないと思います( 私のスタックオーバーフローの質問 )なので、常に実行しているだけだと考えました。

私は現在、コマンドラインで次のように起動しています:

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

起動時にこれを自動的に行うには、どの方法を使用すればよいですか?提案されているように、cronを使用する必要があります here

9
Paul D. Waite

Debianでは、Xvfbコマンドを/etc/rc.localに追加できます。 Xvfbがバックグラウンドに切り離されない場合は、コマンドの最後に&を使用します。

Cronを使用しても機能しますが、起動スクリプトが実行されるタイミングをinitスクリプトで正確に制御できるため、サービスを開始する従来の方法です。

6
Andy

@ Gilles が示唆するように、特にSeleniumテストで使用する場合は、オンデマンドで実行する方が適しています。シェルコマンドの例を次に示します。

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

前にxdpyinfoを使用して表示を確認すると、仮想フレームバッファーを2回実行しないようになります。


起動時に本当に起動する必要がある場合は、次の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

ソース: dloman/xvfb at GitHub (fork from: jterrace/xvfb

/etc/init.d/xvfbとして保存し、実行可能にしてから、次のように起動します。

/etc/init.d/xvfb start

起動時に自動的に実行するには、次を実行:

Sudo update-rc.d xvfb defaults

自動実行から削除するには、次を実行:

Sudo update-rc.d -f xvfb remove

Xプログラムで認識されるようにenvironmentファイルにも追加します。例:

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

これがsystemdバージョンのバージョンです: dloman/xvfb.service

4
kenorb

あなたの前提は無効です:Xvfbをrootとして実行する理由はありません。通常のXサーバーは、ビデオハードウェアにアクセスできるようにするために、ルートとしてのみ実行する必要があります(多くのunicesではありません)。これは、Xvfbの問題ではありません。

起動時にXvfbを実行する場合は、5つの日時フィールドを@rebootに置き換えてcronを使用できます。 rootだけでなく、どのユーザーのcrontabでもそれを行うことができます。しかし、私は要点を理解していません。必要なときにXvfbを開始した場合、スクリプトは当初の計画どおりに、より堅牢になります。