最近发现了一个非常有意思的项目: witr (why-is-this-running) 。
这是一个命令行工具,它能够通过分析进程之间的因果关系,帮助用户快速定位某个进程、服务或端口占用的源头。
这款工具背后的原理其实并不复杂,因此本文想通过剖析它的实现机制,来加深大家对相关系统工具及其原理的理解。
源仓库:https://github.com/pranshuparmar/witr
基于Python的简化实现: https://github.com/bobozi-cmd/witr-py
<aside> 💡
Everything as a Process question
</aside>
这个项目想要解决的核心问题在于:传统的 Unix 工具如 ps、top、lsof 等,虽然可以展示进程的状态和元数据,但用户仍然需要手动关联多个工具的输出来推断进程的启动原因。
为了提供更便捷、更高效的调试方式,witr 能够自动构建完整的进程溯源链条,并在此基础上做出相应分析。
witr 设计的核心思想就是 everything as a process question.
无论是端口、服务、容器还是命令,最终都可以映射到具体的进程 PID。借助进程的 PPID 信息,就可以向上溯源,构建出完整的因果链条。基于这条因果链,我们便能进一步分析该目标的各种状态:
witr 的第一步,是将用户输入的“目标”转换为一个具体的进程 PID。目前工具支持以下三种目标类型:
端口号与名称解析都可以通过相应的系统工具映射到背后的 PID。如果某个目标对应多个 PID,witr 会提示用户手动选择其中一个进行后续分析。