← 返回全部文章

谁把这个进程拉起来的?

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,使用 pslsofsysctlpgrep
  • Windows:x86_64 、 arm64,使用原生 Win32 API 、 Service Control Manager,不依赖 PowerShell 或 WMI;
  • FreeBSD:x86_64 、 arm64,使用 procstatpslsof

按功能看,按名称、 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_PRELOADDYLD_* 这类注入迹象。

这些 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

来源:https://github.com/pranshuparmar/witr