15

我正在编写一个使用 Selenium 对另一个网站进行屏幕抓取的网络应用程序。这种屏幕抓取每天只发生一次,所以我宁愿不要让 Selenium 和 Xvfb 一直运行。

我试图弄清楚如何从 Python 启动 Xvfb 和 Selenium,然后在屏幕抓取完成后停止它们。

如果我是手动操作,我会在命令行启动它们,然后点击CTRL C停止它们。我正在尝试从 Python 做同样的事情。

我似乎能够像这样成功启动 Xvfb:

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

但是当我试图终止它时:

xvfb.terminate()

然后尝试再次启动它(通过重复我的初始命令),它告诉我它已经在运行。

4

2 回答 2

7

我不知道你为什么要以 root 身份运行 Xvfb。您通常的 X 服务器只需要以 root 身份运行(在许多但不是所有的 unice 上),以便它可以访问视频硬件;根据定义,这对 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 回答