Claude Code 内存泄漏?一行命令救你的 MacBook

TL;DR: 我写了一个开源工具来解决这个问题 → claude-code-cleanup


最近用 Claude Code 和 Codex CLI 的时候,发现一个问题:MacBook 越用越卡,风扇狂转。

打开活动监视器一看,十几个 claude 进程在后台跑,每个占用 60-170MB 内存。有的用户甚至累积到了 30GB。

这不是我的个例。去 GitHub Issues 一查,发现这是个已知的、官方尚未修复的 Bug

问题有多严重?

我在 Claude Code 和 Codex CLI 的官方仓库里找到了大量相关 Issue:

Claude Code:

  • #19433/exit 命令不能终止子进程,导致孤儿进程累积
  • #20369 — 子代理进程不清理,累积 30GB 内存
  • #11377 — 进程消耗 23GB RAM,143% CPU
  • #4953 — 进程增长到 120GB+,被 OOM killer 杀死
  • #18859 — 空闲 18 小时后每个会话累积约 15GB 内存

Codex CLI:

  • #7932 — 后台进程泄漏,Esc 退出后进程继续运行
  • #9345 — 严重内存泄漏

这些 Issue 目前都是 Open 状态。官方还没给出完整的修复方案。

根本原因

问题出在子进程管理上:

主 Claude/Codex 进程(被 /exit 或关闭终端终止)
├── 子进程 1(未收到终止信号 → 变成孤儿)
├── 子进程 2(未收到终止信号 → 变成孤儿)
└── 子进程 N(累积... 每个 60-170MB)

当你关闭 Claude Code 或 Codex CLI 时,主进程终止了,但它的子进程没有被正确清理。这些孤儿进程的父进程 ID (PPID) 变成 1,继续在后台运行、占用内存。

解决方案

既然官方还没修,我们就自己动手。

我写了一个完整的清理工具,开源在 GitHub:claude-code-cleanup

包含:

  • ccclean.sh — 带交互式界面的完整清理脚本
  • Claude Code Skill — 支持 /ccclean 命令

下面是几种不同复杂度的解决方案。

方案 1:手动清理(立即见效)

# 查看有多少孤儿 Claude 进程
ps aux | grep '[c]laude' | awk '$7 == "??" {print $2}' | wc -l

# 杀死所有孤儿进程
ps aux | grep '[c]laude' | awk '$7 == "??" {print $2}' | xargs kill -9 2>/dev/null

# 或者简单粗暴:杀死所有 Claude 相关进程
pkill -f claude

# Codex CLI 同理
pkill -f codex

方案 2:添加快捷命令

~/.zshrc~/.bashrc 中添加:

alias claude-cleanup='ps aux | grep "[c]laude" | awk "\$7 == \"??\" {print \$2}" | xargs kill -9 2>/dev/null && echo "✅ Claude 孤儿进程已清理"'

之后只需运行 claude-cleanup 即可。

方案 3:自动定时清理

如果你经常忘记手动清理,可以设置一个每小时自动执行的守护程序:

cat > ~/Library/LaunchAgents/com.user.claude-cleanup.plist << 'PLIST'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.user.claude-cleanup</string>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/bash</string>
        <string>-c</string>
        <string>ps aux | grep '[c]laude' | awk '$7 == "??" {print $2}' | xargs kill -9 2>/dev/null || true</string>
    </array>
    <key>StartInterval</key>
    <integer>3600</integer>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>
PLIST

# 加载守护程序
launchctl load ~/Library/LaunchAgents/com.user.claude-cleanup.plist

管理命令:

# 查看状态
launchctl list | grep claude-cleanup

# 手动触发一次清理
launchctl start com.user.claude-cleanup

# 不想用了?卸载它
launchctl unload ~/Library/LaunchAgents/com.user.claude-cleanup.plist
rm ~/Library/LaunchAgents/com.user.claude-cleanup.plist

方案 4:完整清理脚本(推荐)

如果你想要更安全、更完整的解决方案,可以使用我写的 ccclean.sh 脚本:

# 下载
curl -O https://raw.githubusercontent.com/YuancFeng/claude-code-cleanup/main/ccclean.sh
chmod +x ccclean.sh

# 运行
./ccclean.sh

这个脚本的安全特性:

  • 精确匹配:只清理进程名完全为 claude 的进程,不会误杀其他程序
  • PID 复用保护:清理前验证进程启动时间,防止误杀新进程
  • 运行时长保护:跳过运行少于 5 分钟的进程
  • 双重确认:列出所有候选进程,让你选择后再次确认
  • 优雅终止:先发送 SIGTERM,等待后才发送 SIGKILL

日常使用建议

在官方修复之前,这些习惯可以帮你减少问题:

建议说明
每 30-45 分钟重启一次设个定时器,避免内存无限累积
多用 /clear 命令清理上下文,减少内存占用
关闭时用 /exit虽然也有问题,但比直接关终端好一点
避免长时间空闲空闲会话也会泄漏内存

总结

问题答案
这是已知问题吗?是,官方 GitHub 有大量相关 Issue
官方修复了吗?尚未完全修复
有解决方案吗?有,见上面的手动/自动清理方法

Claude Code 是个很强的工具,但这个内存泄漏问题确实影响体验。希望官方能尽快修复。

在此之前,claude-cleanup 命令就是你的好朋友。


开源工具

我把完整的解决方案开源在了 GitHub:

YuancFeng/claude-code-cleanup

包含两个工具:

  1. ccclean.sh — 独立的 bash 脚本,带交互式界面,可以直接下载运行
  2. Claude Code Skill — 如果你也在用 Claude Code,可以把 skill/SKILL.md 复制到你的 skills 目录,然后直接用 /ccclean 命令清理

欢迎 Star 和提 Issue。