witr
更新于 2026-09-18 16:28:57 · 创建于 2026-09-18 16:15:44
它解决什么问题
witr(Why Is This Running)只回答一个问题:这个东西为什么在跑?
排查线上问题时我们手里有一堆工具——ps、top、lsof、ss、systemctl、docker ps——它们都只告诉你「现在有什么」,至于「它是被谁拉起来的、被什么在守着」,得自己人肉在几个命令的输出之间对照。witr 把这层因果关系显式化了:给它一个进程名、PID、端口、文件或容器,它输出一条完整的因果链。
典型的痛点是「部署时明明停掉了服务,端口还占着」,或者「这台机器上不知道谁起的 node 进程」,这类问题用 witr 基本一条命令定位。
核心思路
witr 把一切都当成进程问题:端口、服务、容器、文件最终都映射到 PID,一旦确定了 PID,剩下的就是沿着父子关系和 supervisor 信息往上回溯。
它回答四件事:
- 现在跑的是什么?
- 它是怎么启动的?
- 是什么在让它一直活着(systemd / pm2 / docker / cron / shell)?
- 它属于什么上下文(工作目录、Git 仓库、容器、绑定地址)?
安装
单文件静态二进制,覆盖 Linux / macOS / Windows / FreeBSD。生态打包非常全,这是它 22k star 的直观体现:
# Homebrew(推荐,方便升级)
brew install witr
# Debian/Ubuntu 官方源(Ubuntu 26.04+ / Debian sid 起)
sudo apt install witr
# Arch AUR
yay -S witr-bin
# 快速安装脚本
curl -fsSL https://raw.githubusercontent.com/pranshuparmar/witr/main/install.sh | bash
# Go 直接装
go install github.com/pranshuparmar/witr/cmd/witr@latest
Windows 侧 winget install -e --id PranshuParmar.witr、choco install witr、scoop install main/witr 都有;另外 npm、Conda、nix、aqua、Guix、FreeBSD ports 也都独立维护。需要注意的是各发行版包可能落后于 GitHub release,追新特性就用安装脚本或 go install。
还提供了一个浏览器沙盒(https://pranshuparmar.github.io/witr/ ),在一台模拟 Linux 机器上直接跑教程和自由探索,不装也能先感受输出长什么样——这个做法对降低上手门槛很聪明。
用法与输出
witr node # 按名称查(默认子串模糊匹配)
witr nginx -x # 精确匹配
witr --port 5000 --short # 只输出因果链
witr --pid 143895 --tree # 树状展示祖先 + 子进程
witr --file /var/lib/dpkg/lock
witr --container redis --verbose
witr nginx --port 5432 --pid 1234 # 多目标混合,按输入顺序分段输出
一条 witr node 的输出大致是:
Process : node (pid 14233)
User : pm2
Command : node index.js
Started : 2 days ago (Mon 2025-02-02 11:42:10 +05:30)
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)
Why It Exists 就是核心价值所在。Source 会尽量给出唯一的主责任方:systemd unit(带 timer 调度信息)、launchd、SSH 会话(含远端 IP 和终端)、docker 容器、pm2、cron、交互式 shell(能识别 tmux/screen)、Snap/Flatpak 沙箱。
比较实用的几个附加能力:
- Warnings 段:以 root 运行、非 root 进程带危险 capability(CAP_SYS_ADMIN 等)、监听在
0.0.0.0/::、重启次数超阈值、RSS 超 1GB、运行超 90 天、二进制已被删除、LD_PRELOAD/DYLD_*注入迹象。这类提示在安全巡检里意外地好用。 - 可脚本化的退出码:0 正常 / 1 有警告 / 2 未找到 / 3 权限不足 / 4 输入非法 / 5 内部错误,直接能用在 CI 和监控告警里:
witr nginx --short
case $? in
0) echo "All clear" ;;
1) echo "Warnings detected" ;;
2) echo "Process not running" ;;
esac
- JSON 输出(
--json):把 witr 接进自己的排障脚本或 AI Agent 工具链的关键,不用去 parse 人类可读的文本。 - Shell 补全:
witr completion bash|zsh|fish|powershell一键生成。
TUI 模式
直接敲 witr 或 witr -i 进入交互式面板,四个标签页:
- Processes:实时可排序可过滤的进程列表,侧栏显示选中进程的祖先树
- Ports:监听端口 + 占用进程,
a键切换 LISTEN-only / ALL - Containers:把 Docker、Podman、nerdctl、K8s/crictl、Incus、LXC、LXD、FreeBSD jail 的容器汇总成一个列表,附挂载、网络、compose 项目元数据
- Locks:系统级文件锁(Linux 读
/proc/locks,macOS/FreeBSD 从 lsof 推导),a切到全部打开的 fd,/搜索
此外支持鼠标操作、深浅色自适应主题、自适应刷新(3 秒起,负载高时自动退避),Unix 上还能直接在 UI 里发信号(Kill/Terminate/Pause/Resume)或 renice。排查「谁占着端口/文件锁」时比敲一堆命令快得多。
平台差异(选型前必看)
| 能力 | Linux | macOS | Windows | FreeBSD |
|---|---|---|---|---|
| 按名称/PID/端口/文件/容器查 | ✅ | ✅ | ✅ | ✅ |
| 环境变量 | ✅ | ⚠️ SIP 限制 | ⚠️ 受保护进程不可读 | ✅ |
| tmux/screen 识别 | ✅ | ✅ | ❌ | ✅ |
| 调度检测(systemd timer / launchd) | ✅ | ✅ | ❌ | ❌ |
| 文件锁 | ✅ | ✅ | ❌ | ✅ |
| 危险 capability 告警 | ✅ | ❌ | ❌ | ❌ |
| TUI 进程操作(发信号/renice) | ✅ | ✅ | ❌ | ✅ |
Linux 走 /proc 功能最全;macOS 靠 ps/lsof/sysctl/pgrep;Windows 用原生 Win32 API(ToolHelp32/PSAPI/SCM),不依赖 PowerShell 或 WMI,这点在受限环境里是优势;FreeBSD 用 procstat。
上手体验与注意点
- 基本零学习成本:命令语义直白,
--short和--tree是最常用的两个开关,前者适合塞进脚本,后者适合给人看。 - 权限影响结果:部分信息(环境变量、别的用户的进程、某些 socket)需要 sudo,官方也提示信息不全时先试
sudo witr。用普通用户跑看不到东西不代表工具坏了。 - 容器查询需要 runtime CLI 在 PATH 里(docker/podman/nerdctl/crictl/incus/lxc/lxc-ls/jls),纯靠 socket 的场景会查不到。
- 模糊匹配会一次命中多个:
witr ng可能同时命中 nginx 和 ngrok,此时它会列出候选并要求你--pid重跑,或者干脆加-x。 --verbose才输出容器挂载/网络/compose 元数据,默认输出刻意保持单屏。- 输出原则是「best effort + 显式不确定」,所以看到 "unknown" 是设计使然,不是 bug。
适用场景
- 事故排查(incident response):追查异常进程的来源链、谁占了端口、谁锁着文件
- 服务器交接:面对一台别人搭的机器,快速搞清每个常驻进程是谁拉起来的
- 容器/K8s 节点巡检:一次性汇总多运行时容器,定位「这个端口其实在容器里」
- 安全巡检:root 运行、危险 capability、公网监听、
LD_PRELOAD注入迹象 - CI/监控:用 JSON 输出和退出码做进程存活与告警状态的断言
- 教学:
Why It Exists的因果链是讲清 Linux 进程/supervisor 模型的好素材
二开与集成建议
- 先接 JSON,别 parse 文本:
witr --json是稳定的机器接口,把它包一层成内部排障 API 或给 AI Agent 当工具最省事。 - 退出码做门禁:CI 里加一步
witr <关键进程> --warnings,把「有告警」当成非 0 失败,比 grep 日志可靠。 - 和监控联动:把 warnings 里的「公网监听」「危险 capability」「重启过多」抽成事件推到告警系统,等于给主机加了一层轻量运行时审计。
- 容器场景补齐:在节点上统一装好各 runtime 的 CLI,容器查询能力才完整;否则
--container会静默退化。 - TUI 当日常面板:把
witr -i放进 tmux 常驻窗口,比反复敲htop+ss -tunlp更省事。 - 配合 sudo 做权限设计:如果要在多人机器上开放给非 root 用户,注意它读取的信息本身有一定敏感性(环境变量可能含密钥),别随手把 JSON 输出暴露到共享面板上。
一句话总结
ps/lsof/systemctl 告诉你「什么在跑」,witr 告诉你「谁让它跑的、谁在守着它」——单文件二进制、四平台、二十多种包管理器,还自带 TUI 和 JSON,是运维与排障工具箱里值得常备的一件。
网盘下载(迅雷)
- 版本:windows/amd64
- 文件:witr-windows-amd64.zip
- 分享链接:https://pan.xunlei.com/s/VP1nagqYXg0FIcJjnY2QYT0uA1
- 提取码:z2fb