如何告别 lsof 进程查找并整理你的端口
熟悉的场景:你启动一个本地服务器,终端却抛出一个再熟悉不过的错误 Error: listen EADDRINUSE: address already in use :::3000。昨天的 worker 没有正常终止,后台进程卡住了,或者某个 Docker 容器在悄悄占用所需的 socket。

通常情况下,常规流程就开始了。你打开终端,在 macOS 上回忆 lsof -i :3000 的语法或在 Windows 上用 grep netstat -ano,复制 PID,然后输入 kill -9。如果你有十几个微服务,终端就变成了重复命令的坟墓。
PortPal 项目解决了这个虽小但持续存在的问题。它是一个轻量级桌面仪表板,显示被占用的端口、识别技术栈,并可通过一键按钮终止冗余进程。
底层原理以及为什么你需要它
大多数类似的工具要么是系统命令的简单包装,要么拖着笨重的 Electron,光是显示五行列表就要消耗 1GB 内存。
PortPal 的开发者选择了一条更优雅的路线,基于 Tauri 2、Rust 和 React 19 构建应用程序。由于 Rust 的加持,后端在后台运行时几乎不占用 CPU,原生窗口也能瞬间打开。
该工具解决了几个日常任务:
- 查找挂起的本地端口并提取进程元数据。
- 根据文件上下文和默认端口识别环境。
- 帮助强制停止进程或重启它。
- 将服务间的网络连接可视化为图形。
主要功能
项目识别而非枯燥数字
普通的系统监视器只会告诉你 PID 和二进制名称(例如 node 或 python)。如果有五个不同的 Node.js 项目在运行,仅凭终端输出根本无法区分它们。
PortPal 更智能。它不仅查看 socket 编号,还会扫描工作目录。程序会查找清单文件(package.json、Cargo.toml、go.mod),并将端口号与流行的开发环境进行匹配:
3000 -> React / Next.js
5173 -> Vite
4200 -> Angular
8000 -> Django
5432 -> PostgreSQL
6379 -> Redis
结果,仪表板显示清晰的卡片:你可以立即看到前端运行在 5173 端口,数据库监听在 5432 端口。
交互式连接图
界面最有趣的部分是使用 D3.js 库构建的拓扑图。

你得到的是一个带有节点的物理模拟,而不是扁平的表格。节点根据技术类型着色:蓝色代表数据库,紫色代表 Vite 打包工具,绿色代表 Node.js 后端。节点可以在屏幕上拖动,可以用鼠标滚轮缩放,可以实时检查活动的网络链接。如果你在开发一个包含多个微服务的系统,这样的图形有助于快速了解当前谁与谁保持着连接。
一键管理和紧急按钮
每个进程旁边都有一个终止按钮。点击叉号——进程立即终止,socket 被释放。
如果某个端口被 PortPal 记住的崩溃脚本占用,旁边会保留一个重启按钮。它会在单独的终端中再次运行该命令。
在界面中,端口分为两组:开发进程和系统服务。意外终止系统服务更难。而且当你结束工作日,想要一次性关闭所有运行的本地服务器时,开发框架组有一个 Kill All 按钮。
后台运行和系统托盘
PortPal 最小化到通知区域。托盘图标根据端口冲突的存在情况改变颜色。窗口关闭时,后台线程会记录事件:新进程何时启动、哪个 socket 被释放、哪里出现了流量峰值。带有所有时间戳的历史记录存储在单独的日志标签页中。
架构和技术栈
项目的技术栈看起来很现代:
Backend: Rust (sysinfo + системные API сетевого стека)
Runtime: Tauri 2
Frontend: React 19 + TypeScript + Vite 7
Графика: D3.js v7 (симуляция графов на силах)
Стили: Vanilla CSS со стеклянными эффектами
通过放弃笨重的前端组件库并使用原生 Webview,应用程序变得轻量级,在持续扫描 socket 时消耗最少的资源。
如何启动
开发者在仓库的 releases 页面发布现成的构建版本:
- 对于 Windows,提供
.msi和.exe格式。 - 对于 macOS,为 Apple Silicon 芯片和 Intel 处理器准备了
.dmg构建版本。 - 对于 Linux,有
.deb包和通用的.AppImage格式。
如果你想从源码构建或添加自己的检测规则,需要 Rust 1.70 或更高版本以及 Node.js 18+:
# Клонируем репозиторий
git clone https://github.com/wisher567/Portpal.git
cd portpal
# Ставим зависимости и запускаем в dev-режиме
npm install
npm run tauri dev
在开发模式下,Vite 的 React 组件热重载与 Rust 部分编译并行工作。
个人感受
这个项目还很年轻,目前处于 0.2 版本,但它已经看起来像是一个可以日常使用的工具。基本的端口表和卡片运行很快。D3.js 地图最初看起来像是装饰,但当同时调试 API 网关、数据库和几个客户端时,它被证明确实有帮助。
小缺点包括自动框架识别的数据库有限。如果你在一个非标准端口(如 9211)上运行自定义服务,PortPal 会将其显示为普通进程,直到你手动绑定上下文。但由于该项目是 MIT 许可的开源项目,在代码中向签名列表添加内容很简单。
谁会觉得它有用:Web 开发者、全栈工程师,以及每个经常同时运行十几个本地微服务并厌倦了记忆 socket 清理命令的人。
相关项目