如何杀死python os.system()

时间:2017-04-10 11:40:10

标签: python linux flask

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

但是,os.system创建的某些进程(例如,os.system('git clone xxx'))在守护程序被终止后仍在运行。 所以我该怎么做?谢谢大家!

2 个答案:

答案 0 :(得分:2)

为了能够杀死进程,您需要其进程ID(通常称为pid)。 os.system并不能为您提供,只需返回子流程返回代码的值。

较新的subprocess模块为您提供了更多控制权,但代价是更复杂。特别是它允许您等待进程完成,如果需要可以超时,并允许您访问子进程的pid。虽然我不是它的使用专家,但似乎 工作。请注意,此代码需要Python 3.3或更高版本才能使用timeout调用Popen.wait参数。

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 :(得分: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。但要小心,你不想杀错东西,否则可能会发生不好的事情!