Show HN: Witr – 解释 Linux 系统中进程运行的原因
Hacker News 摘要原标题:Show HN: Witr – Explain why a process is running on your Linux system
Witr 是一个专门用于回答这个进程为什么在运行的 Linux 系统工具。在 Linux 系统中,当一个进程、服务或端口处于运行状态时,背后通常都有一个原因。这个原因往往是间接的、不明显的,或者跨越了多个层级,例如守护进程、容器、服务管理器或终端。
虽然传统的系统工具如 ps、top、lsof、ss、systemctl 和 docker ps 可以展示系统的状态和元数据,告诉用户什么在运行,但它们通常需要用户手动关联不同工具的输出才能推断出原因。Witr 的作用是让这种因果关系变得显而易见,它能在一个易于阅读的界面中解释一个运行中的对象来自哪里、是如何启动的,以及当前是由哪个系统链条负责维持其运行。
核心目标与定位
Witr 的设计初衷包括:
• 解释原因:侧重于解释进程存在的原因,而不仅仅是确认它存在。
• 缩短时间:在排查故障或系统停机时,帮助工程师快速理解现状。
• 零配置:无需复杂设置即可直接使用。
• 安全只读:采用只读操作,不会对系统造成破坏。
• 追求清晰:相比于信息的完整堆砌,更看重输出内容的清晰度。
该工具并非监控工具或性能分析器,也不旨在替代 systemd 或 Docker 的原生工具,更不会提供自动修复功能。
工作原理
Witr 将所有的查询请求(如端口、服务或命令)都转化为进程问题。一旦确定了具体的进程识别号即 PID,Witr 就会构建一条因果链。它主要回答四个问题:什么在运行、它是如何启动的、是什么在维持它运行、它属于什么上下文环境。
支持的查询目标
用户可以通过以下三种方式启动分析:
1. 名称查询:直接输入进程或服务的名称,例如 witr node 或 witr nginx。如果存在多个同名匹配项,程序会提示用户通过 PID 进行区分。
2. PID 查询:使用 --pid 参数分析特定的进程。
3. 端口查询:使用 --port 参数分析正在监听特定端口的进程。
输出内容组成
Witr 的输出结果通常保持在一个屏幕内,并包含以下几个标准化板块:
• 目标:显示用户请求查询的对象。
• 进程信息:包括可执行文件、PID、运行用户、完整命令、启动时间以及重启次数。
• 存在原因:这是该工具的核心价值所在,它会展示一个因果祖先链。例如:systemd (pid 1) -> pm2 (pid 5034) -> node (pid 14233)。
• 来源:识别负责管理该进程的主要系统,如 systemd 单元、Docker 容器、pm2、cron 或交互式终端。
• 上下文:提供工作目录、Git 仓库名称及分支、Docker 容器镜像名称、网络绑定情况(公网或私网)等。
• 警示信息:提供非阻塞的观察结果,例如进程是否以 root 权限运行、是否监听在公网接口、是否频繁重启、内存占用是否超过 1GB,以及运行时间是否超过 90 天。
常用命令行选项
• --pid:解释特定 PID 的背景。
• --port:解释特定端口的使用情况。
• --short:提供单行摘要输出。
• --tree:显示完整的进程祖先树。
• --json:以 JSON 格式输出结果,便于程序处理。
• --warnings:仅显示警告信息。
• --no-color:禁用彩色显示。
• --env:仅显示该进程的环境变量。
安装与运行环境
Witr 仅支持 Linux 平台,并以静态二进制文件形式分发,支持 amd64 和 arm64 架构。用户可以通过官方提供的脚本进行快速安装,脚本会自动检测架构并将程序安装到 /usr/local/bin/witr,同时安装相关的参考手册。
在权限方面,由于 Witr 需要检查 /proc 文件系统,在分析某些受限进程时可能需要提升权限。如果无法看到完整的进程祖先或环境信息,建议配合 sudo 使用。该项目在开发过程中也借助了 GitHub Copilot 和 ChatGPT 等 AI 工具的辅助。