3分钟上手 witr:一条命令讲清进程为什么在运行
【免费下载链接】witrWhy is this running? Trace any process, port, container, or file back to what started it - CLI + TUI.项目地址: https://gitcode.com/GitHub_Trending/wi/witr
服务器上有个陌生进程,你 kill 掉它,重启后它又自己回来了。它到底是谁拉起来的?靠 ps、lsof、systemctl 一个个对线索,查一次要半天。witr 就是冲着这个问题做的:给它一个进程名、PID、端口或文件,它直接回答"这个进程为什么在运行",并给出完整的启动链。
🔧 装起来:两条命令落地
witr 以单个静态二进制分发,Linux、macOS、Windows、FreeBSD 都支持,不带 Go 工具链也能装,没有依赖要处理。
有 Homebrew(macOS 或 Linux)的话,一条命令最省事:
brew install witrWindows 上等价的做法是 winget,装完重开一个终端即可:
winget install -e --id Pranshuparmar.witr装完跑一条命令验证:
witr --version能打印出版本号,说明二进制和 PATH 都没问题。另外,不带任何参数直接敲witr会进入交互式 TUI,这是它的主界面,后面细说。
🎯 核心场景
看进程从哪来
机器上跑着一个 node,你不确定它是谁拉起来的、会不会自己复活。敲:
witr node输出重点看两段。Why It Exists 给因果链,比如systemd (pid 1) → pm2 (pid 5034) → node (pid 14233),从 1 号进程一路数到你眼前这个;Source 只挑一个主要责任方,是 systemd 单元、launchd 服务、cron 定时任务、docker 容器还是 pm2,一眼定位。末尾还附工作目录、Git 仓库名、监听地址,判断"它为什么还活着"基本够用。名字默认子串匹配,命中多个进程时它会列出候选,提示你用--pid <pid>再查。
端口被谁占了
确认 5432 上是谁在监听、它从哪来。敲:
witr --port 5432witr 先把端口解析到 PID,再输出和查进程一样的因果链。有个实用细节:如果端口挂在 PID 1 上——systemd socket 激活或容器运行时托管——它会继续下钻到容器层,帮你落到具体容器,而不是让你对着 PID 1 发呆。
交互式 TUI:盯着整机看
不想一个个查,想盯着整机实时看。敲:
witr -i四个页签各管一块:Processes 是实时可排序的进程列表,侧栏显示选中进程的祖先树;Ports 列监听端口及占用进程;Containers 跨 Docker、Podman、nerdctl、K8s 等运行时给容器列表;Locks 看系统文件锁。支持鼠标点行、点列头排序,选中进程可以直接发信号(终止、暂停、恢复)或调优先级,该操作仅限 Unix 平台。列表自适应刷新,高负载时自动降频。
⚡ 进阶玩法
- 一行因果链:加
--short,输出只剩systemd → pm2 → node这种单行链条,最适合塞进脚本和监控。 - 树状视图:
--tree把祖先和子进程(最多 10 个)画成树,目标进程会被高亮。 - 机器可读:
--json输出结构化结果,方便管道给 jq 或其他工具。 - 看环境变量:
--env直接打印目标进程的环境变量。 - 精确匹配:
-x或--exact关掉子串搜索,witr ng这种模糊查询不会再误中 ngrok。 - 反查文件和容器:
--file /var/lib/dpkg/lock看谁占着这个文件;--container redis按名称、镜像或 compose 项目搜容器。 - 一次查多个:
--pid、--port、--file、--container都可重复,还能和名字参数混着写,结果按输入顺序分段输出。 - 只要异常点:
--warnings只输出可疑项,比如进程以 root 运行、监听 0.0.0.0、内存超 1GB、二进制已被删除。
参数全集(含所有短写)在仓库的 docs/cli/witr.md 里,等价于 man 页。
⚠️ 避坑速查
- 信息比预期少→ Linux/FreeBSD 上加 sudo 再跑,它要读 /proc 和服务管理目录,普通权限可能看不到。
- macOS 有天花板→ SIP(系统完整性保护)下,部分系统进程细节即使 sudo 也拿不到,这是系统限制,不是 witr 的问题。
- Windows 要管理员终端→ 看其他用户或系统服务的进程,必须以管理员身份开 PowerShell。
- 子串误命中→
witr ng会同时匹配 nginx 和 ngrok,选不出来就换--exact,或改用--pid精确定位。 - 脚本判断结果→ 退出码 2 表示没找到、3 表示权限不足,写监控时直接判
$?即可。
想深挖"它是怎么分辨 cron 还是 systemd"这类检测逻辑,可以看 internal/source/ 下的源码。
下一步
装好之后,先敲witr进 TUI 把四个页签点一遍,再挑一个真实进程跑一次--tree——"谁拉起来的"这个问题,一条命令就交代清楚了。
【免费下载链接】witrWhy is this running? Trace any process, port, container, or file back to what started it - CLI + TUI.项目地址: https://gitcode.com/GitHub_Trending/wi/witr
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考