📌 项目地址:pranshuparmar/witr | ⭐ 17,488 颗星 | 🔧 Go | 📜 Apache-2.0
问题:知道“什么在跑”,不知道“为什么在跑”
拿到一台服务器,看到一个陌生进程,想搞清楚它是谁拉起来的。通常的做法是拼图:
ps aux拿到PIDpstree -p找父进程systemctl status检查是否有对应的服务单元docker ps找关联的容器IDcrontab -l翻计划任务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直接告诉你一条链——每个节点标了类型:systemd、container-shim、sshd、cron等。你看到的就是它怎么来的、被谁拉起来的、中间经过哪些托管系统。
命令行模式
当因果链需要被其他工具消费时(比如报警系统、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会话在跑脚本。过去我得跑who、last和ps aux交叉对比。
它不做什么
不做性能监控。CPU、内存、磁盘实时负载,那是top/htop的事。也不管理服务,不是systemctl的替代品。它只做因果溯源。
你需要知道一个进程是怎么起来的、被谁拉起来的、中间有哪些托管系统。witr是目前唯一一个把这件事做到单命令完成的东西。安装后花两分钟试试,运行witr,上下逛逛,应该能体会到它补了什么缺口。
如果你想用来自动化或报警集成,去看看README的Flags和Examples章节,里面有详细的参数说明和示例输出。