📌 项目地址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 直接显示链上的每个节点,标注类型:systemddocker-containerd-shimsshdcron。你看到的就是它怎么来的,中间经过几个托管系统。

我试了。CPU 飙高,进 TUI 选中占用高的进程,右栏显示 systemd → docker-containerd-shim → myservice。过去我得 docker ps 查容器 ID → docker top 找 PID → pstree -p 倒推 → 翻 systemctl 找 unit。现在一条链,5 秒。

另一个案例:CPU 报警,TUI 显示链尾是 sshd → bash → python。知道是某个 SSH 会话在跑脚本,不用跑 wholastps 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 顶部,建议你先去点一点,再决定要不要装。

这篇文章对你有帮助吗?

发表回复