如何使用Python中的子进程模块启动和停止Linux程序?

时间:2011-04-01 17:02:24

标签: python linux selenium subprocess xvfb

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

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

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

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

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

但是当我试图终止它时:

xvfb.terminate()

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

2 个答案:

答案 0 :(得分:7)

我不知道你为什么要以root身份运行Xvfb。您通常的X服务器只需要以root身份运行(在许多但不是所有unices上),以便它可以访问视频硬件;根据定义,这不是Xvfb的问题。

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

终止X服务器时,您可能会看到zombie process。这实际上不是一个进程(它已经死了),只是当进程表中的一个条目在父进程读取子进程或其自身死亡时消失。僵尸大多是无害的,但是调用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).

答案 1 :(得分:1)

我假设您可以对系统进行参数化,以允许任何用户按照here解释所有问题的解释来启动Xvfb

修改 正确的命令行是

sudo chmod u+s `which Xvfb`