私は、SelenumとPythonを介して時々画面をスクレイピングするために使用しているDebian Webサーバーを持っています。
私は、Seleniumによって制御されている場合に、Firefoxが実行される仮想XサーバーとしてXvfbを使用しています。私はSudo
を使用してこれを開始する必要がある(考える)と考えると、Pythonから毎回開始するのは現実的ではないと思います( 私のスタックオーバーフローの質問 )なので、常に実行しているだけだと考えました。
私は現在、コマンドラインで次のように起動しています:
Sudo Xvfb :99 -nolisten tcp -fbdir /var/run
起動時にこれを自動的に行うには、どの方法を使用すればよいですか?提案されているように、cron
を使用する必要があります here ?
Debianでは、Xvfbコマンドを/etc/rc.local
に追加できます。 Xvfbがバックグラウンドに切り離されない場合は、コマンドの最後に&
を使用します。
Cronを使用しても機能しますが、起動スクリプトが実行されるタイミングをinitスクリプトで正確に制御できるため、サービスを開始する従来の方法です。
@ 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 。
あなたの前提は無効です:Xvfbをrootとして実行する理由はありません。通常のXサーバーは、ビデオハードウェアにアクセスできるようにするために、ルートとしてのみ実行する必要があります(多くのunicesではありません)。これは、Xvfbの問題ではありません。
起動時にXvfbを実行する場合は、5つの日時フィールドを@reboot
に置き換えてcronを使用できます。 rootだけでなく、どのユーザーのcrontabでもそれを行うことができます。しかし、私は要点を理解していません。必要なときにXvfbを開始した場合、スクリプトは当初の計画どおりに、より堅牢になります。