📌 项目地址pranshuparmar/witr | ⭐ 17,488 颗星 | 🔧 Go | 📜 Apache-2.0

问题:知道“什么在跑”,不知道“为什么在跑”

拿到一台服务器,看到一个陌生进程,想搞清楚它是谁拉起来的。通常的做法是拼图:

  1. ps aux 拿到PID
  2. pstree -p 找父进程
  3. systemctl status 检查是否有对应的服务单元
  4. docker ps 找关联的容器ID
  5. crontab -l 翻计划任务
  6. journalctl 翻启动日志

每个工具只给一个碎片,你得自己组装因果链。如果进程嵌套在容器里,容器又由systemd管理,或者从SSH session里启动的shell又调用了supervisor —— 这种多层关系,靠ps/pstree根本看不清。

witr的做法:一次性输出整条因果链

witr是一个Go写的单二进制工具。它不展示CPU占用或内存使用(那是htop的事),而是沿着进程树向上追溯,从PID 1开始,在每个节点标注启动方式——systemd的service单元、docker-containerd-shim、bash、sshd、cron、supervisord等——整条链在终端里一次性呈现。

README原话:“It explains where a running thing came from, how it was started, and what chain of systems is responsible for it existing right now.”

安装:两条命令,四个系统

支持Linux、macOS、FreeBSD、Windows。安装脚本自动识别OS(linux/darwin/freebsd)和CPU架构(amd64/arm64),下载最新二进制并安装man page。

# 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推荐优先用包管理器安装,更新方便。脚本是最快上手方式。

两种使用方式:TUI和命令行

交互式TUI

直接执行witr,进入一个终端仪表盘。左栏是进程列表(默认按CPU占用排序),右栏实时显示选中进程的因果链。上下键移动,右侧自动刷新。

和htop的关键区别在定位上。htop给你PID、CPU%、内存,但你需要自己去猜“这个进程是谁拉起来的”。witr直接告诉你一条链——每个节点标了类型:systemdcontainer-shimsshdcron等。你看到的就是它怎么来的、被谁拉起来的、中间经过哪些托管系统。

命令行模式

当因果链需要被其他工具消费时(比如报警系统、CI流水线、日志收集器),TUI就不方便了。witr支持通过命令行参数指定目标进程,直接打印文本链。具体有哪些参数和输出格式,去README的Flags章节看,这里不编造。

它是怎么做到的?

witr沿着/proc或系统接口向上追溯祖先进程,同时识别几种常见的“启动层”。识别方法靠的是cgroup路径、环境变量、父进程名称这些特有标识。于是能在链上标注“这个进程是由docker-containerd-shim运行的容器启动的”,而不是只给一串数字PID。

常见识别对象:systemd的服务单元、docker containerd-shim、终端session、SSH登录(sshd)、tmux/screen、cron任务、runit、supervisor等。

我试了一下:一条链替代几次命令切换

我的机器上混合跑着:systemd服务、Docker容器,还有同事通过SSH上来跑脚本。

进TUI,选一个CPU占用较高的进程,右栏立刻显示一条链:

systemd → docker-containerd-shim → myservice

过去我需要:docker ps看容器ID → docker top找PID → pstree -p倒推 → 最后发现是init进程链。四个命令,中间还容易搞混PID。现在一个命令搞定。

另一个场景:CPU报警,TUI显示因果链结尾是sshd → bash → python。我知道是同事的SSH会话在跑脚本。过去我得跑wholastps aux交叉对比。

它不做什么

不做性能监控。CPU、内存、磁盘实时负载,那是top/htop的事。也不管理服务,不是systemctl的替代品。它只做因果溯源。

你需要知道一个进程是怎么起来的、被谁拉起来的、中间有哪些托管系统。witr是目前唯一一个把这件事做到单命令完成的东西。安装后花两分钟试试,运行witr,上下逛逛,应该能体会到它补了什么缺口。

如果你想用来自动化或报警集成,去看看README的FlagsExamples章节,里面有详细的参数说明和示例输出。

这篇文章对你有帮助吗?

发表回复