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

15 投票
2 回答
2872 浏览
提问于 2025-04-16 14:54

我正在写一个网页应用,使用Selenium来抓取另一个网站的信息。这种抓取每天只进行一次,所以我不想一直让Selenium和Xvfb在后台运行。

我想弄明白如何从Python启动Xvfb和Selenium,然后在抓取完成后停止它们。

如果是手动操作,我会在命令行启动它们,然后按CTRL C来停止它们。我想在Python中实现同样的功能。

我似乎可以成功地这样启动Xvfb:

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

但是当我尝试终止它时:

xvfb.terminate()

然后再尝试通过重复我的初始命令来重新启动它时,系统告诉我它已经在运行了。

2 个回答

0

我想你可以设置你的系统,让任何用户都能像这里所说的那样启动Xvfb,这样就能解决你所有的问题。点击这里查看具体方法

编辑 正确的命令行是

sudo chmod u+s `which Xvfb` 
7

我不太明白你为什么想以root用户身份运行Xvfb。通常情况下,X服务器需要以root身份运行(在很多但不是所有的Unix系统上),主要是为了能够访问视频硬件;但对于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).

撰写回答