📌 项目地址:pranshuparmar/witr | ⭐ 17,488 颗星 | 🔧 Go | 📜 Apache-2.0
服务器 CPU 飙到 100%,top 里冒出个陌生进程。你开始翻 ps aux 看启动命令,pstree -p 追父进程,systemctl status 查服务单元,docker ps 对容器 ID。输出散在五个标签页里,你得拿脑子当关系数据库用。这个过程我走了上百次,每次至少 3-5 分钟。
witr 把这个因果链自动化了。输入一个进程名或 PID,它沿 /proc 里的进程树向上追溯,在每个节点告诉你“这东西是被什么拉起来的”。输出是一条链,人和机器都能读。
项目是 Go 写的单二进制文件,GitHub 上 17488 个 star,不依赖 D-Bus、Docker daemon 或任何外部接口。下载就能跑。
—
安装:一个命令,不用装其他依赖
支持 Linux、macOS、FreeBSD、Windows。安装脚本自动识别系统和 CPU 架构。
# Unix(Linux / macOS / FreeBSD)
curl -fsSL https://raw.githubusercontent.com/pranshuparmar/witr/main/install.sh | bash
# Windows PowerShell
irm https://raw.githubusercontent.com/pranshuparmar/witr/main/install.ps1 | iex
默认装到 /usr/local/bin/witr,man page 放到 /usr/local/share/man/man1/witr.1。想改路径传 INSTALL_PREFIX。
如果你用 Homebrew、Conda、Winget 这类包管理器,README 也推荐走那边更新更方便。包装状态可以查 Repology,但社区包可能比 GitHub 发布版滞后一点(需要独立审核和验证流程)。
—
两个用法,对应两个场景
交互式 TUI:人在现场排查
直接执行 witr,进入一个终端仪表盘。左栏是进程列表(按 CPU 排序),右栏显示选中进程的因果链。上下键移动,右侧自动刷新。
跟 htop 的关键区别:htop 给你 PID、CPU%、内存量,要你自己猜“这个进程谁拉的”。witr 直接显示链上的每个节点,标注类型:systemd、docker-containerd-shim、sshd、cron。你看到的就是它怎么来的,中间经过几个托管系统。
我试了。CPU 飙高,进 TUI 选中占用高的进程,右栏显示 systemd → docker-containerd-shim → myservice。过去我得 docker ps 查容器 ID → docker top 找 PID → pstree -p 倒推 → 翻 systemctl 找 unit。现在一条链,5 秒。
另一个案例:CPU 报警,TUI 显示链尾是 sshd → bash → python。知道是某个 SSH 会话在跑脚本,不用跑 who、last、ps aux 交叉对比。
命令行模式:给脚本和报警系统用
如果报警系统、CI 流水线或日志收集器要消费这条因果链,用命令行模式传目标进程名,拿机器可读的输出(JSON 格式)。具体支持的 flag 和输出格式,README 的 Flags 和 Examples 章节有完整说明,这里不重复。
—
原理:只在 /proc 里翻东西
witr 不依赖 D-Bus、Docker daemon 或任何外部接口。它沿 /proc 中的进程树向上追溯祖先进程。关键几步:
- 读
cgroup路径,推断是否在容器里 - 捞环境变量,找
DOCKER_、container=这类标识 - 对比父进程名称,匹配 systemd、sshd、tmux、cron、supervisord 等特征
它认识的对象包括:systemd 服务单元、docker-containerd-shim、SSH 会话、tmux/screen、cron、runit、supervisor。
一个进程跑在 Docker 容器里,容器由 systemd 管理,shell 从 SSH 会话启动。pstree 只能看到 PID 数字,你分不清哪一层是容器栈。witr 的链上会标出 systemd → docker-containerd-shim → myservice。
—
边界清晰
witr 不做性能监控。CPU、内存、磁盘实时负载,那是 top/htop 的事。不管理服务,不是 systemctl 的替代品。定位和诊断,不是控制和修改。
如果一个进程的父进程死了被 init(PID 1)收养,witr 会在链上标明 orphaned 状态,告诉你这条链断了。
—
适合谁用
- 运维/SRE:快速定位异常进程归属,减少“翻几个窗口”的时间
- 开发:在测试环境看自己的容器服务是怎么被拉起来的
- 任何被“这个进程哪来的”问题烦过的人
你不需要安装任何其他依赖。下载,运行,看结果。
—
最后提一句:witr 的 README 里还提供了一个 浏览器在线试玩 的链接,可以模拟 Linux 环境探索,不需要安装就能体验。地址在 README 顶部,建议你先去点一点,再决定要不要装。