如何终止由Python os.system()创建的进程

4

我有一个使用Python3的Flask应用程序。有时它会创建守护进程来运行脚本,然后当超时时(使用signal.SIGINT)我想要杀死守护进程。

但是,一些由os.system创建的进程(例如os.system('git clone xxx'))在守护进程被杀死后仍然在运行。

那么我该怎么办呢?非常感谢!


你使用 os.system() 而不是 subprocess 调用有什么特别的原因吗?后者可以让你更好地控制创建的子进程。 - tripleee
可能是因为不了解。subprocess 模块相对较为晦涩,而使用 os.system 的示例仍然存在很多。尽管其文档中写道 "subprocess 模块提供了更强大的功能来生成新进程并检索它们的结果",但只有在阅读文档后才能知道这一点... - holdenweb
2个回答

8
为了能够杀死一个进程,你需要它的进程ID(通常称为pid)。os.system无法提供它,只返回子进程的返回值。新的subprocess模块提供了更多的控制,但相应地也更加复杂。特别的,它允许你等待进程完成,并在需要时设置超时时间,同时也给你访问子进程pid的权限。虽然我不是它的专家,但它似乎很好用。请注意,这段代码需要使用Python 3.3或更高版本才能使用Popen.wait调用的timeout参数。
import subprocess

process = subprocess.Popen(['git', 'clone', 'https://github.com/username/reponame'])
try:
    print('Running in process', process.pid)
    process.wait(timeout=10)
except subprocess.TimeoutExpired:
    print('Timed out - killing', process.pid)
    process.kill()
print("Done")

1
在命令行中运行以下命令,可以显示所有正在运行的Python实例。
$ ps aux | grep -i python
username  6488   0.0  0.0  2434840    712 s003  R+    1:41PM   0:00.00 python

第一个数字6488是PID,即进程标识符。查看您机器上的命令输出以找到您想要终止的进程的PID。
您可以运行另一个命令来终止正确的进程。
$ kill 6488

你可能需要在这个命令前使用sudo。但要小心,不要杀错东西,否则会发生糟糕的事情!

1
但是子进程并不运行Python。你如何区分多个同时运行相同命令行的进程? - holdenweb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接