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


9

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

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

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

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

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

回答:


6

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

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


ああ、素晴らしい。自分の個別のスクリプトで/etc/rc.local使用update-rc.dするよりも編集を優先しますか?
ポールD.ウェイト2011

2
@Paulをお勧めしupdate-rc.dますが、確かにより能力がrc.localありますが、より速くて簡単です。また、Gillesは正しいと思います。これをrootとして実行する必要がある理由はありません。
アンディ

4

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

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


有効なポイント。1つのコマンドに対してのみXvfbを実行するには、xvfb-run通常Xvfbに付属しているコマンドを使用できます。これがxvfb-run manpages.debian.org/stretch/xvfb/xvfb-run.1.en.htmlのcliリファレンスです。@Paulの場合、次のように実行できますxvfb-run --server-args="-nolisten tcp -fbdir /var/run" python some-selenium.py
。– sebisnow

4

以下のよう@Gillesが提案され、それはあなたがSeleniumのテストのためにそれを使用している場合は特に、オンデマンドで実行する方が適しています。シェルコマンドの例を次に示します。

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

xdpyinfobeforeを使用してディスプレイをチェックすると、仮想フレームバッファを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

ソース:GitHubのdloman / xvfb(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

environmentXプログラムによって認識されるようにファイルに追加します。例:

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

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


私はこれが1歳であることを知っていますが、これで動作するJavaScriptセレンバージョンを取得できないようです。起動後に実行すると機能しますが、サービスとして起動するとxvfbが検出されないようです。最初に両方をサービスとして機能させるにはどうすればよいですか?
Masinde Muliro 2017

@MasindeMuliroその後、別の質問をすることができるので、問題に固有の回答をさらに更新できます。
kenorb 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.