15

Seleniumを使用して別のWebサイトをスクリーンスクレイピングするWebアプリを作成しています。この画面スクレイピングは1日に1回しか発生しないため、SeleniumとXvfbを常に実行したままにしたくはありません。

PythonからXvfbとSeleniumを起動し、スクリーンスクレイピングが完了したらそれらを停止する方法を理解しようとしています。

手動で行う場合は、コマンドラインで起動し、を押しCTRL Cて停止します。私はPythonから同じことをしようとしています。

次のようにXvfbを正常に起動できるようです。

xvfb = Popen('Xvfb :99 -nolisten tcp', shell=True)

しかし、私がそれを終わらせようとしたとき:

xvfb.terminate()

次に、(最初のコマンドを繰り返して)再起動しようとすると、すでに実行中であることがわかります。

4

2 に答える 2

7

Xvfbをrootとして実行する理由がわかりません。通常のXサーバーは、ビデオハードウェアにアクセスできるようにするために、rootとして(すべてではないが多くのユニスで)実行する必要があるだけです。定義上、これはXvfbの問題ではありません。

tempdir = tempfile.mkdtemp()
xvfb = subprocess.Popen(['Xvfb', ':99', '-nolisten', 'tcp', '-fbdir', tempdir])

Xサーバーを終了すると、ゾンビプロセスが表示される場合があります。これは実際にはプロセスではなく(デッド)、親プロセスが子の終了ステータスを読み取るか、それ自体が停止したときに消えるプロセステーブルのエントリにすぎません。ゾンビはほとんど無害ですがwait、終了ステータスを読み取るために呼び出す方がクリーンです。

xvfb.terminate()
# At this point, `ps -C Xvfb` may still show a running process
# (because signal delivery is asynchronous) or a zombie.
xvfb.wait()
# Now the child is dead and reaped (assuming it didn't catch SIGTERM).
于 2011-04-01T19:28:16.253 に答える
0

ここで説明するように、すべてのユーザーがXvfbを起動できるように、システムをパラメーター化できると思います。すべての問題を解決します。

正しいコマンドラインを編集します

sudo chmod u+s `which Xvfb` 
于 2011-04-01T18:03:43.290 に答える