🧹 DevClean
繁体中文版README
用于开发环境的智能、安全、闪电般快速的清理脚本。
它识别并杀死孤立的后台进程(其中 PPID=1)回收内存 而不会影响您的活动开发会话 (如IDE、终端或Claude Code/AI代理)。
专门针对 macOS 移动开发人员(Flutter/iOS/Android)和使用现代人工智能工具的开发人员(MCP服务器)。
为什么你需要这个
人工智能驱动的编码工具和移动开发工具链产生了后台进程 经常不清理自己这些孤立的进程默默地积累、消耗 10-20+GB内存 甚至在你注意到你的机器变慢之前。
与其在活动监视器中手动查找它们或重新启动, devclean 在几毫秒内安全地清除它们。
根本原因
1.MCP服务器:退出时不清理
克劳德代码、游标、OpenCode和反重力生成等工具 MCP(模型上下文协议) 服务器作为子进程。当父IDE或终端退出时,特别是通过崩溃、强制退出或关闭选项卡退出时,这些子进程是 未终止他们成了孤儿(PPID=1)并无限期地继续运行。
为什么会发生:
- macOS缺少
prctl(PR_SET_PDEATHSIG)--有 没有本土方式 当父母去世时,自动杀死孩子。 - Node.js
child.kill()发送SIGTERM,但 不等待清理,并嵌套npm exec包装器添加了信号无法传播的额外层。 - 这 MCP协议指定了一个优雅的关机阶段,但大多数主机实现在退出时不会调用它。
现实世界影响:
| 工具 | 问题 | 影响 |
|---|---|---|
| 克劳德代码 | 退出时MCP服务器未终止 | 进程在会话中累积 |
| 克劳德代码 | 铬MCP生成~4/min,无需清理 | 27GB 超过~10小时 |
| 克劳德代码 | 父终端失效时,子代理泄漏 | 每个孤立进程约45 MB |
| 克劳德代码 | VS代码扩展泄漏了工作进程 | Linux上触发OOM杀手 |
| 光标 | MCP子进程未清理 | 几天内约3-5GB |
| 光标 | MCP过程会随着时间的推移而积累 | 数十名孤儿 node/npm 过程 |
| 反重力 | 语言服务器内存消耗高 | 退出后僵尸进程;后端端口未清除 |
| 反重力 | MCP服务器按工作区生成,从未清理过 | 工艺爆炸;~10 GB空闲RAM |
2.前端开发服务器:Ctrl+C并不总是有效
| 工具 | 问题 | 影响 |
|---|---|---|
| webpack开发服务器 | 端口占用,节点进程延迟 | |
| webpack开发服务器 | 子进程不能被杀死 | 父退出不会终止服务器 |
| Vue/webpack | 开发服务器在Ctrl+C后继续运行 | 需要手动杀死 |
3.Flutter/Dart:SIGTERM无法到达VM(移动设备)
这 flutter command是一个shell脚本包装器。当IDE在关机时发送SIGTERM时,信号会击中shell进程,但 不会传播到底层Dart VM当shell干净退出时,VM进程成为孤立进程。
Flutter守护进程也 生成子流程,如 xcdevice observe 它们从未被清理过。
| 工具 | 问题 | 影响 |
|---|---|---|
| 颤振 | xcdevice observe 被守护进程泄露 | 孤立的子进程堆积起来 |
| FVM | FVM管理 dart/flutter 流程可能会卡住(例如。 fvm use 等待交互式输入) | 卡住的进程以100%的CPU累积 |
4.Gradle:Daemon乘法
5.iOS模拟器:无声记忆猪
CoreSimulator处理以前Xcode会话中的进程 徘徊在背景中 因为Xcode 不知道你还需要什么 不会帮你清理的。他们共同消费 10-20+GB.
6.逻辑选项+:已知内存泄漏
logioptionsplus_agent 有a 有据可查的内存泄漏 这已经报道了3年多了。代理从~100 MB开始,但 随着时间的推移增长到多GB --在极端情况下高达36GB。自从 launchd 自动重新启动它,唯一实用的解决方案是定期终止进程并让它重新启动。罗技尚未完全解决此问题。
______________________________________________________________________
我们如何解决它
| 策略 | 如何 | 积极工作安全? | |
|---|---|---|---|
孤立检测 (PPID=1) | 只杀死父进程已死亡的进程——这是泄漏进程的定义特征 | 是的——活动的IDE/终端子进程总是有一个活着的父进程 | |
| 模式匹配 | 通过以下方式针对已知罪犯 ORPHAN_PATTERNS 正则表达式数组,不是毯式进程终止 | 是的——只匹配特定的工具签名 | |
**pgrep 结束 `ps\ | grep`** | 用途 pgrep -f 避免自匹配并减少误报 | 是 |
| 前端开发服务器 | 捕获孤立的webpack-dev服务器、vite、next.js、esbuild、turbopack进程 | 是的——只有PPID=1个孤立进程 | |
| 优雅的终止 | SIGTERM→ 2等一下→ SIGKILL仅适用于无响应的进程 | 是--为进程提供保存状态的时间 | |
| 深度模式分离 | 重守护进程(Gradle、Kotlin LSP、FVM、反重力语言服务器、Logi选项+)需要显式 --deep 旗; xcodebuild 进一步仅限于孤儿 | 是的——选择加入,从不意外 | |
| 试运行 | --dry-run 预览所有内容而不杀死 | N/A--只读 |
______________________________________________________________________
安装
git clone https://github.com/ImL1s/devclean.git
cd devclean
./install.sh注: 确保~/.local/bin在你的PATH。将此行添加到您的~/.zshrc或~/.bashrc: ``bash export PATH="$HOME/.local/bin:$PATH"``
______________________________________________________________________
用法
安全模式(默认)
安全模式仅针对分离的孤立工具(PPID=1).它是 旨在避免活动会话 --连接到活父进程(IDE、终端、shell)的进程永远不会匹配。
devclean深度清洁模式(--deep)
关闭重型后台守护进程,这些守护进程在技术上不是孤立的,但在空闲时会消耗GB的RAM。 *(Gradle等工具将在下次构建时自动重新启动。)*
警告: 深度模式会杀死非孤立的Gradle、Kotlin LSP、Flutter守护进程、FVM进程、反重力语言服务器、Logi Options+代理和Ruby/Fastlane进程。如果构建或编译正在积极运行,则可能会中断。使用 --dry-run 首先预览会受到影响的内容。devclean --deep干运行模式(--dry-run)
预览脚本内容 *会* 杀死而不实际终止任何事情。非常适合审计您可以回收多少内存。
devclean --dry-run
devclean --deep --dry-run优化模式(--optimize)
应用一次性修复以减少资源浪费:禁用VS Code/Coursor/Antigravity/Kiro中的崩溃报告器,清理Crashpad转储文件,并禁用已知的资源浪费后台代理。
devclean --optimize
devclean --optimize --dry-run磁盘清理模式(--disk)
通过清理开发缓存和构建工件来回收磁盘空间。所有清理过的项目都是可重建的——您的下一个构建将重新下载所需的内容。
目标:Xcode DerivedData、iOS设备支持、Gradle缓存、CocoaPods、Flutter发布缓存、npm缓存、FVM不完整版本、Gemini浏览器录制、项目 build/, .dart_tool/, .gradle/, node_modules/ 目录。
devclean --disk
devclean --disk --dry-run帮助(-h, --help)
devclean --help______________________________________________________________________
定制
通过编辑将您自己的工具添加到清理列表中 ORPHAN_PATTERNS 数组中 devclean 脚本:
ORPHAN_PATTERNS=(
# AI & MCP Servers (Common)
"mcp-server|playwright-mcp"
# ... add yours here!
"my-custom-heavy-daemon"
)然后运行 ./install.sh 再次在全球范围内应用这些更改。
______________________________________________________________________
贡献
欢迎拉取请求!如果您知道其他开发工具经常留下孤立的后台进程,请随时打开PR将其添加到默认正则表达式模式中。
许可证
该项目根据MIT许可证获得许可。
