我有一个使用python3的Flask应用程序。有时它会创建守护进程来运行脚本,然后我想在超时时杀死守护进程(使用signal.SIGINT
)。
但是,os.system
创建的某些进程(例如,os.system('git clone xxx')
)在守护程序被终止后仍在运行。
所以我该怎么做?谢谢大家!
答案 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
。但要小心,你不想杀错东西,否则可能会发生不好的事情!