📅 2026-08-10 · ☕ 8 分钟阅读
排查服务器问题时,你一定遇到过这样的灵魂拷问:「这个进程/端口/容器到底是谁启动的?为什么它还在运行?」。传统工具 ps、top、lsof、ss 只能告诉你什么在运行,至于为什么——需要你自己把 systemd、PM2、Docker、shell 的输出拼起来猜。
witr(Why Is This Running)就是来解决这个问题的:GitHub 上 20k+ star 的开源工具,用一条命令把任何进程、端口、容器或文件追溯到确切启动它的那一条链路——从 systemd → PM2 → node 的完整因果链,一目了然。支持 CLI 输出(人类可读或 JSON)和交互式 TUI 两种模式。
witr 是单静态二进制,支持多种安装方式:
# Unix (Linux / macOS / FreeBSD) 一键安装
curl -fsSL https://raw.githubusercontent.com/pranshuparmar/witr/main/install.sh | bash
# 或用包管理器(推荐,方便升级)
brew install witr # macOS
conda install witr # 通用
winget install witr # Windows
npm install -g witr # 任意平台
Windows 用户也可以用 PowerShell 安装:
irm https://raw.githubusercontent.com/pranshuparmar/witr/main/install.ps1 | iex
安装后验证:
witr --version
最简单的用法——查看某个进程是谁启动的:
# 按进程名查
witr node
# 按 PID 查
witr 12345
# 按端口查(这个最常用)
witr :8080
# 查 Docker 容器
witr container webapp
输出示例(伪代码):
🔍 node (PID 12345)
└─ 由 systemd 服务 pm2-node 启动
└─ PM2 进程管理器 (PID 100)
└─ 由 systemd 启动
└─ 由 init (PID 1) 引导
一条命令就还原了 systemd → PM2 → node 的完整链路,不用再 ps -ef 加 systemctl status 来回切换。
不记得命令参数?直接进交互界面:
witr
会打开一个 TUI 仪表盘,可以:
如果你更喜欢在浏览器里先体验,官方提供了一个在线模拟沙箱——模拟一台 Linux 机器,含引导教程和自由练习模式,无需安装即可上手。
要写脚本或接入监控系统?输出 JSON:
witr :8080 --json
witr node --json | jq .
这样就能把溯源结果接入告警、审计或自动化排查流程。
传统工具暴露的是状态和元数据:进程在运行、端口被占用、容器存在——但"谁启动的"、"通过什么链路启动的"得靠人脑关联。witr 做的是把因果链显式化:
| 场景 | 传统做法 | witr |
|---|---|---|
| 8080 端口被谁占用? | lsof -i :8080 → 记 PID → ps -ef → 查 systemd unit | witr :8080 一步到位 |
| 这个 node 进程为什么在跑? | 猜(cron? pm2? 手动?) | 直接给出启动链路 |
| 容器是谁拉起的? | docker inspect 逐层翻 | witr container <name> |
核心价值在于:原因往往间接、不直观——被 supervisor、容器、服务、shell 层层包裹。witr 把这些层一次性穿透。
address already in usewitr :3000,看到是旧版 PM2 的 node 还占着pm2 delete 干净收尾witr 进 TUIwitr container app 看容器由谁拉起(docker compose? k8s? 手动 run?)witr 是 2026 年最值得装进工具箱的排查利器之一。它不替代 ps/lsof,而是补上它们缺失的最后一环——因果链。服务器上但凡出现过"这进程哪来的"的疑问,就值得花 30 秒装上它。
查自己启动的进程不需要;要完整还原系统级服务(systemd 等)的链路,建议以 root 或 sudo 运行,能拿到更完整的因果链。
htop/btop 是资源监控器,展示 CPU/内存等实时状态;witr 是溯源工具,回答"谁启动的、为什么在运行"。两者互补,不冲突。
支持。witr 提供 Windows 二进制,可通过 winget 或 PowerShell 脚本安装。
用包管理器安装的直接卸载对应包;用 install.sh 安装的删除 /usr/local/bin/witr 和 man page 即可。
📌 相关阅读:时间戳完全指南 · 正则表达式完全教程 · 2026 开发者必备免费工具箱