首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >如何避免僵尸进程

如何避免僵尸进程

作者头像
Michael阿明
发布2026-03-25 13:14:06
发布2026-03-25 13:14:06
360
举报

一、什么是僵尸进程?

在 Linux 中,子进程调用 exit() 后,内核会保留其 PID、退出码等信息,直到父进程通过 wait()waitpid() 取走。

如果父进程迟迟不取,子进程就处于 Z (zombie/defunct) 状态,俗称“僵尸进程”。

僵尸不耗内存,但占用进程表项;大量堆积会导致 fork: Resource temporarily unavailable

二、僵尸进程的产生链路

  1. 父进程 fork()/multiprocessing.Process.start()/subprocess.Popen() 创建子进程。
  2. 子进程 正常结束被 OOM-killer 杀死(SIGKILL 9)。
  3. 父进程 未调用wait/waitpid未注册SIGCHLD 处理器。
  4. 子进程变成僵尸,PID 仍挂在进程表。

三、Python 中 3 种“零僵尸”写法

方案

代码示例

适用场景

1. 手动 join

p = Process(...); p.start(); p.join()

少量子进程

2. with ProcessPoolExecutor

with ProcessPoolExecutor() as pool: pool.map(...)

并行任务

3. SIG_IGN

signal.signal(signal.SIGCHLD, signal.SIG_IGN)

Unix 常驻服务


四、实战:OOM 场景对比

4.1 不收割 → 僵尸堆积
代码语言:javascript
复制
# oom_zombie.py
import multiprocessing as mp

def leak():
    _ = [bytearray(1024*1024) for _ in range(10000)]

if __name__ == "__main__":
    mp.Process(target=leak).start()  # 不 join
    input("press enter to quit...")

运行:

代码语言:javascript
复制
systemd-run --scope -p MemoryMax=100M python oom_zombie.py

再开终端:

代码语言:javascript
复制
watch -n1 'ps -eo pid,ppid,state,comm | grep python'

会看到 <defunct> 僵尸。

代码语言:javascript
复制
 9530    9529 Z python3 <defunct>
4.2 with 上下文 → 零僵尸
代码语言:javascript
复制
# oom_with_ctx.py
from concurrent.futures import ProcessPoolExecutor
import os

def leak():
    _ = [bytearray(1024*1024) for _ in range(10000)]

if __name__ == "__main__":
    print("Parent PID:", os.getpid())
    with ProcessPoolExecutor(max_workers=2) as pool:
        pool.submit(leak)
        pool.submit(leak)
    print("All reaped, no zombies.")

五、小结

✅ 永远用 with:ProcessPoolExecutor、Pool、Popen ✅ 或显式 join() / wait() ✅ Unix 常驻服务可兜底 SIGCHLD = SIG_IGN ✅ 监控:ps -eo pid,ppid,state,comm | grep 'Z' ✅ 减少 OOM:控制并发、量化模型、加 swap

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-09-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Michael阿明 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、什么是僵尸进程?
  • 二、僵尸进程的产生链路
  • 三、Python 中 3 种“零僵尸”写法
  • 四、实战:OOM 场景对比
    • 4.1 不收割 → 僵尸堆积
    • 4.2 with 上下文 → 零僵尸
  • 五、小结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档