python - 如何杀死由 python os.system() 创建的进程

标签 python linux flask

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

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

最佳答案

为了能够终止一个进程,您需要它的进程 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")

关于python - 如何杀死由 python os.system() 创建的进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43322201/

相关文章:

python - 仅读取 CSV 文件中的一个随机行并移动到另一个 CSV

python - 禁止在 matplotlib 绘图中显示坐标

linux - 如何在 xemacs 中运行 gdb 以获取交叉编译的代码?

javascript - Chart.js 未更新 Flask python 或接收来自 Flask 的数据

javascript - 如何与 Django 中的生物识别指纹读取器通信

python - 在 Windows 10/Pycharm 中使用 Vagrant 从 Python 调用 FastDownward planner

linux - 文件列表

linux - 在子 shell 中运行的脚本不运行与调用脚本相同的 shell

database - 如何在 Flask 应用程序中使用 pytest 清除/拆卸数据库

python - Flask SQLAlchemy db.create_all() 不创建数据库