谁把这个进程拉起来的?
witr 是一个跨 Windows、Linux、macOS 的进程排查工具。它不只告诉你进程在跑,还会解释它从哪里来。

服务器上突然多了一个进程,占着端口、吃着内存、还不知道是谁拉起来的。ps 能看到 PID,top 能看到资源占用,lsof 能查端口,systemctl 能看服务,docker ps 能看容器。
问题是,这些工具通常只告诉你“它在跑”。真正排障时,更烦的是下一句:它为什么在跑?
witr 就是冲着这个问题来的。名字来自 “Why is this running?”。它把进程、端口、服务、容器、文件锁这些线索串起来,尽量给出一条人能看懂的因果链:谁启动了它、它属于哪个服务或容器、当前由哪一层系统维持。

它解决的是哪类痛点
开发和运维都遇到过这类场景:
- 机器上有个
node/python/java进程,不知道来自哪个项目; - 端口 5000 、 5432 、 8080 被占用,但不知道是谁占的;
- 容器、 systemd 、 pm2 、 cron 、 tmux 、 SSH session 混在一起,排查要来回切工具;
- 进程能看到,工作目录、 Git 分支、上级进程、监听端口、容器来源还要自己拼;
- 出问题时只想快速判断:该杀、该停服务、该改配置,还是该找启动它的人。
witr 的价值在这里。它不替代所有系统工具,它把常用线索合并成一个更接近排障问题的答案。
GitHub README 里的示例很直观:
witr node
输出会告诉你:目标进程是 node,PID 是多少,用户是谁,命令是什么,启动时间是什么。更有用的是这一段:
Why It Exists :
systemd (pid 1) → pm2 (pid 5034) → node (pid 14233)
Source : pm2
Working Dir : /opt/apps/expense-manager
Git Repo : expense-manager (main)
Sockets : 127.0.0.1:5001 (TCP | LISTENING)
这比单独看 ps aux 省心很多。你马上知道它是 PM2 拉起来的,项目目录在哪,监听哪个端口。

支持 Windows 、 Linux 、 macOS
这点值得单独说。很多进程诊断工具在 Linux 上很好用,到了 macOS 或 Windows 就只能退化成“能跑一点”。witr 的 README 明确列了平台支持:
- Linux:x86_64 、 arm64,基于
/proc,功能最完整; - macOS:x86_64 、 arm64,使用
ps、lsof、sysctl、pgrep; - Windows:x86_64 、 arm64,使用原生 Win32 API 、 Service Control Manager,不依赖 PowerShell 或 WMI;
- FreeBSD:x86_64 、 arm64,使用
procstat、ps、lsof。
按功能看,按名称、 PID 、端口、文件、容器查询都支持 Windows 、 Linux 、 macOS 。 TUI 里的进程、端口、容器、进程详情也都跨平台。差异主要在系统能力上,比如 Windows 没有类 Unix 的文件锁视图,也不能像 Unix 那样直接在 TUI 里发信号暂停/恢复进程。
Windows 用户要注意一点:如果要看其他用户或系统服务的详细信息,需要用管理员权限打开终端。
# 管理员 PowerShell
.\witr.exe [your arguments]
macOS 也类似,部分信息可能需要 sudo,而且 SIP 保护下的系统进程即使用 sudo 也不一定能完全读取。
安装方式
最省事的方式,是按系统选择包管理器。
Linux / macOS 可以用脚本安装:
curl -fsSL https://raw.githubusercontent.com/pranshuparmar/witr/main/install.sh | bash
macOS 或 Linux 上有 Homebrew 的话:
brew install witr
Windows 可以用 PowerShell 安装脚本:
irm https://raw.githubusercontent.com/pranshuparmar/witr/main/install.ps1 | iex
也可以直接用 winget:
winget install -e --id PranshuParmar.witr
跨平台用户还可以用 Conda / Mamba / Pixi:
conda install -c conda-forge witr
mamba install -c conda-forge witr
pixi global install witr
NPM 也有包:
npm install -g @pranshuparmar/witr
如果你已经有 Go 环境,可以直接从源码安装:
go install github.com/pranshuparmar/witr/cmd/witr@latest
安装完先确认版本:
witr --version
日常怎么用
最常见的用法是按进程名查:
witr nginx
witr node
witr python
默认是模糊匹配。如果匹配到多个结果,它会提示你用 PID 再查。想要精确匹配,可以加:
witr nginx --exact
查端口很适合排“端口被占用”:
witr --port 8080
witr --port 5432 --short
只想看进程链,可以用树形输出:
witr --pid 143895 --tree
查文件占用:
witr --file /var/lib/dpkg/lock
查容器:
witr --container redis
容器查询会尝试跨 Docker 、 Podman 、 nerdctl 、 K8s/crictl 、 Incus 、 LXC 、 LXD 、 FreeBSD jails 等运行时查找。前提是对应 runtime 的 CLI 在 PATH 里。
如果要把结果交给脚本或 CI,可以输出 JSON:
witr nginx --json
它的退出码也适合自动化:0 表示找到且干净,1 表示有 warning,2 表示没找到,3 表示权限不足,4 表示输入有问题或匹配歧义,5 表示内部错误。
TUI 模式更适合现场排障
直接运行 witr,或者加 -i,会进入交互式 TUI:
witr
witr -i
TUI 有四个主要视图:
- Processes:实时进程列表,支持排序、过滤,旁边显示进程祖先树;
- Ports:监听端口和对应进程,可以在 LISTEN-only 和 ALL 之间切换;
- Containers:把 Docker 、 Podman 、 K8s 、 LXC 等运行中的容器放在一个列表里;
- Locks:查看文件锁,Linux 下基于
/proc/locks,macOS / FreeBSD 通过lsof/fstat推导。
这个模式适合“我现在就要知道机器上发生了什么”。它有自动刷新、鼠标支持、进程详情页,还能在 Unix 系统上直接发送 Kill 、 Terminate 、 Pause 、 Resume 或 Renice 。
我会把 TUI 当成应急入口,把命令行查询当成日常脚本入口。
它会给哪些 warning
witr 不只是展示进程链,也会给一些非阻断式观察:
- 进程以 root 身份运行;
- 非 root 进程持有危险 Linux capabilities;
- 监听在
0.0.0.0或::这类公开地址; - 重启次数异常;
- 内存占用超过 1GB;
- 运行时间超过 90 天;
- 可执行文件已被删除;
- 存在
LD_PRELOAD、DYLD_*这类注入迹象。
这些 warning 不等于一定有问题,但很适合做第一轮安全和稳定性排查。比如一个开发服务突然监听到公网地址,或者一个本该普通运行的进程带着可疑注入变量,至少值得看一眼。
我的使用建议
如果你只在本机写代码,先从三个命令开始:
witr --port 3000
witr node
witr -i
如果你管服务器,再加上:
sudo witr nginx --verbose
sudo witr --container redis
sudo witr --file /var/lib/dpkg/lock
如果你在 Windows 上排查服务和桌面程序,优先用管理员 PowerShell 跑:
witr.exe --port 8080
witr.exe chrome
witr.exe -i
这个工具最适合放进“事故排查工具箱”。平时不一定天天用,一旦遇到端口冲突、奇怪进程、容器来源不明、服务反复重启,它能少掉很多来回切命令的时间。
我喜欢它的地方,是它把问题问对了。排障时缺的往往不是更多列表。更有用的是一句能落地的解释:这个东西为什么会出现在这里。
来源链接: https://github.com/pranshuparmar/witr 参考链接: https://x.com/cevenif/status/2071963466588717358