最直接有效的方法是运行sudo lsof -i -p -n | grep listen,可一次性列出所有处于listen状态的tcp/udp端口及对应进程名、pid、绑定地址等完整信息,无需安装、结果精准、覆盖全面。

Mac上启动本地服务失败,提示“Address already in use”,说明某个端口正被其他进程监听,但你不知道是哪个端口、被谁占着——必须立刻查清所有监听中的网络端口及其对应进程,才能精准释放资源。
用lsof一次性列出所有监听端口
打开终端 → 输入命令:sudo lsof -i -P -n | grep LISTEN → 按下回车。
-P参数禁用端口号转服务名(比如不把3000显示成http),-n跳过DNS解析,避免卡顿和地址混淆;sudo是必须的,否则看不到其他用户或系统进程的监听信息。
输出中每行包含COMMAND(进程名)、PID(进程ID)、USER(所属用户)、NAME(绑定地址与端口)。若某行显示 *:3000 (LISTEN),表示该进程同时监听IPv4和IPv6;若只显示 127.0.0.1:5000,则仅限本机访问,不会对外暴露。
精准查询指定端口被谁占用
方法一:基础查法
在终端中输入:lsof -i :端口号(例如 lsof -i :3000)。
方法二:增强查法(推荐)
输入:lsof -P -n -i :端口号(例如 lsof -P -n -i :8080)。
方法三:只取PID(方便后续杀进程)
输入:lsof -ti :端口号(例如 lsof -ti :5432),输出只有数字,可直接复制用于kill命令。
注意:若命令执行后无任何输出,说明该端口当前完全空闲,未被任何进程监听。
用netstat扫描全部TCP监听端口
第一步:在终端中执行 sudo netstat -anvp tcp | grep LISTEN
第二步:逐行检查“Local Address”列,找含目标端口的条目,如 *.8080 或 127.0.0.1.3000(Mac的netstat默认用点号分隔IP与端口)
第三步:记录该行末尾的PID/Program name字段中的数字
第四步:用 ps -p PID -o comm= 查看该PID对应的完整程序名
这条命令比lsof更底层,当lsof因权限或版本问题返回异常空结果时,netstat往往仍能提供可靠快照。
图形化定位:用活动监视器查高网络活跃进程
打开“应用程序”→“实用工具”→“活动监视器” → 点击顶部标签栏的“网络”选项卡 → 按“发送字节”或“接收字节”降序排列 → 找出持续高位波动的进程。
选中可疑进程 → 点击右上角“i”图标 → 在弹出窗口中勾选“显示”→“打开的文件和端口” → 展开“打开的文件和端口”区域查看绑定详情。
必须勾选“打开的文件和端口”才能看到端口绑定详情,否则该区域为空。这个操作适合怀疑GUI应用偷偷占了端口的情况,比如Electron程序、VS Code扩展、或是后台更新服务。











