讲师中心 微信公众号
AI工具推荐 视频效率加速

subprocess 如何在 timeout 时优雅杀死子进程树

云墨吖_6423

云墨吖_6423

发布时间:2026-01-27 18:18:09

|

648人浏览过

|

来源于php中文网

原创

subprocess.run() 的 timeout 参数只终止主进程,不清理子进程树;应使用 start_new_session=True(Linux/macOS)或 CREATE_NEW_PROCESS_GROUP(Windows)配合 killpg/CTRL_BREAK_EVENT,或用 psutil 显式遍历终止整个进程树。

subprocess 如何在 timeout 时优雅杀死子进程树

subprocess.run() 的 timeout 参数只杀主进程,不清理子进程树

Python 的 subprocess.run() 或 subprocess.Popen.wait(timeout=...) 在超时时只会向直接子进程发送信号(如 SIGTERM),但不会递归终止其派生的整个进程树。这意味着 shell 启动的命令链(如 bash -c "sleep 10 & sleep 20")或通过 nohup/& 后台启动的子进程大概率残留。

用 start_new_session=True 配合 os.killpg() 杀整个进程组

关键在于让子进程及其后代运行在独立会话(session)中,这样就能用进程组 ID(PGID)一次性终结整棵树。核心是:start_new_session=True(Linux/macOS)或 creationflags=subprocess.CREATE_NEW_PROCESS_GROUP(Windows)。

  • Linux/macOS 下:调用 os.setsid() 创建新会话,主进程成为会话首进程,其 PGID = PID;后续 fork 出的子进程默认加入该 PGID
  • 启动时必须加 start_new_session=True,否则 os.getpgid(proc.pid) 可能报错或返回父进程组 ID
  • 超时后用 os.killpg(os.getpgid(proc.pid), signal.SIGTERM) 终止整个组,再 wait() 收尸
import subprocess, os, signal, time
<p>proc = subprocess.Popen(
["bash", "-c", "sleep 5; echo 'done'"],
start_new<em>session=True,  # 必须!
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT
)
try:
stdout, </em> = proc.communicate(timeout=2)
except subprocess.TimeoutExpired:
os.killpg(os.getpgid(proc.pid), signal.SIGTERM)
proc.wait()  # 等待进程组彻底退出

Windows 上要用 CREATE_NEW_PROCESS_GROUP + CTRL_BREAK_EVENT

Windows 没有 POSIX 进程组概念,os.killpg 不可用。必须用 subprocess.CREATE_NEW_PROCESS_GROUP 创建独立进程组,再用 os.kill() 发送 signal.CTRL_BREAK_EVENT(不能用 CTRL_C_EVENT,它可能被目标进程忽略)。

Browser Session Manager
Browser Session Manager

使用 Playwright 为 jimeng.jianying.com 管理浏览器会话,导入 cookies/localStorage 以自动化视频生成工作流,支持图片上传等功能

下载
  • CTRL_BREAK_EVENT 能传递给整个控制台进程组,比 TerminateProcess 更温和
  • 必须确保子进程是控制台应用(非 GUI),否则信号无效
  • 调用前需先 proc.terminate() 或直接 os.kill(proc.pid, signal.CTRL_BREAK_EVENT),之后仍要 proc.wait()

更健壮的做法:用 psutil 回收所有后代进程

如果无法控制启动参数(比如不能加 start_new_session),或者跨平台兼容性要求高,推荐用 psutil 手动遍历并终止子树。它不依赖会话机制,而是靠 proc.children(recursive=True) 获取全部后代。

  • 安装:pip install psutil
  • 注意:Windows 上需管理员权限才能终止某些系统相关子进程
  • 务必按逆序终止(先叶子后父进程),避免子进程被 init 进程领养而逃逸
  • 示例中 proc.children(recursive=True) 返回的是实时快照,若进程瞬间启停,可能漏掉极短命子进程
import subprocess, psutil, time
<p>proc = subprocess.Popen(["bash", "-c", "sleep 3 &"])
try:
proc.communicate(timeout=1)
except subprocess.TimeoutExpired:
parent = psutil.Process(proc.pid)
children = parent.children(recursive=True)
for child in reversed(children):  # 先杀孙子,再杀儿子
try:
child.terminate()
except (psutil.NoSuchProcess, psutil.AccessDenied):
pass
try:
parent.terminate()
parent.wait(timeout=3)
except (psutil.NoSuchProcess, psutil.TimeoutExpired):
pass

实际项目里,start_new_session=True 是最轻量且可靠的选择,但前提是能掌控子进程启动方式;一旦涉及遗留脚本、第三方二进制或容器化环境,psutil 的显式树遍历反而更可控——毕竟进程关系不是靠约定,而是靠实时探测。

热门AI工具

更多
讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
pip安装使用方法
pip安装使用方法

安装步骤:1、确保Python已经正确安装在您的计算机上;2、下载“get-pip.py”脚本;3、按下Win + R键,然后输入cmd并按下Enter键来打开命令行窗口;4、在命令行窗口中,使用cd命令切换到“get-pip.py”所在的目录;5、执行安装命令;6、验证安装结果即可。大家可以访问本专题下的文章,了解pip安装使用方法的更多内容。

3190

2023.10.09

更新pip版本
更新pip版本

更新pip版本方法有使用pip自身更新、使用操作系统自带的包管理工具、使用python包管理工具、手动安装最新版本。想了解更多相关的内容,请阅读专题下面的文章。

7243

2024.12.20

pip设置清华源
pip设置清华源

设置方法:1、打开终端或命令提示符窗口;2、运行“touch ~/.pip/pip.conf”命令创建一个名为pip的配置文件;3、打开pip.conf文件,然后添加“[global];index-url = https://pypi.tuna.tsinghua.edu.cn/simple”内容,这将把pip的镜像源设置为清华大学的镜像源;4、保存并关闭文件即可。

8902

2024.12.23

python升级pip
python升级pip

本专题整合了python升级pip相关教程,阅读下面的文章了解更多详细内容。

4567

2025.07.23

session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

580

2023.10.17

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

876

2023.10.18

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

1926

2025.08.19

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3299

2023.07.26

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

60

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn