欢迎来到威聚,大家如果有需要哪个项目编译好的软件但无法自己下载可以进入项目推荐页面告诉我,我上传到网盘供大家下载使用!
威扬盘搜

witr

运维 Go Apache-2.0 Go 人工编写 推荐 ★5 易二开

更新于 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 信息往上回溯。

它回答四件事:

  1. 现在跑的是什么?
  2. 它是怎么启动的?
  3. 是什么在让它一直活着(systemd / pm2 / docker / cron / shell)?
  4. 它属于什么上下文(工作目录、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 模型的好素材

二开与集成建议

  1. 先接 JSON,别 parse 文本:witr --json 是稳定的机器接口,把它包一层成内部排障 API 或给 AI Agent 当工具最省事。
  2. 退出码做门禁:CI 里加一步 witr <关键进程> --warnings,把「有告警」当成非 0 失败,比 grep 日志可靠。
  3. 和监控联动:把 warnings 里的「公网监听」「危险 capability」「重启过多」抽成事件推到告警系统,等于给主机加了一层轻量运行时审计。
  4. 容器场景补齐:在节点上统一装好各 runtime 的 CLI,容器查询能力才完整;否则 --container 会静默退化。
  5. TUI 当日常面板:把 witr -i 放进 tmux 常驻窗口,比反复敲 htop + ss -tunlp 更省事。
  6. 配合 sudo 做权限设计:如果要在多人机器上开放给非 root 用户,注意它读取的信息本身有一定敏感性(环境变量可能含密钥),别随手把 JSON 输出暴露到共享面板上。

一句话总结

ps/lsof/systemctl 告诉你「什么在跑」,witr 告诉你「谁让它跑的、谁在守着它」——单文件二进制、四平台、二十多种包管理器,还自带 TUI 和 JSON,是运维与排障工具箱里值得常备的一件。

网盘下载(迅雷)

按更新时间依次阅读