应使用lsof -i -P -n | grep -i "进程名"反查可疑软件是否监听端口,若输出含(LISTEN)则确认占用;也可用lsof -iTCP -sTCP:LISTEN -P -n -c "进程名"精准筛选其监听端口。

Mac上启动本地服务时报“Address already in use”,你怀疑是某个刚关掉的软件(比如VS Code插件、Postman、Docker Desktop或IDEA残留Java进程)悄悄占着端口没释放,需要快速确认——这时不能只查端口号,得直接锁定可疑软件名是否正在监听端口。
用lsof按进程名反查是否占用端口
打开终端 → 输入命令:lsof -i -P -n | grep -i "进程名",将“进程名”替换成你怀疑的软件名(如 code、postman、docker、java、node)。
这条命令会列出所有网络连接中 COMMAND 列匹配该名称的行,包括处于 LISTEN、ESTABLISHED 或 CONNECTED 状态的连接;只要看到某行末尾有 (LISTEN),就说明它正在监听端口。
例如查 VS Code 是否在监听:lsof -i -P -n | grep -i code,若输出中出现 Code\ Helper 12345 user 27u IPv4 0xabcde123 0t0 TCP *:52698 (LISTEN),则说明其 Helper 进程正占用 52698 端口。
用lsof精准筛出某软件监听的所有端口
方法一:先获取进程PID,再查其绑定端口
执行 pgrep -f "进程名" 获取PID(如 pgrep -f "postman" 返回 9876)→ 再执行 lsof -a -p 9876 -i,即可只显示该进程打开的所有网络端口。
方法二:一步到位查某软件所有监听端口
运行:lsof -iTCP -sTCP:LISTEN -P -n -c "进程名"(注意是 -c,不是 -C),例如:lsof -iTCP -sTCP:LISTEN -P -n -c "node"。这会严格筛选出名为 node 的进程且状态为 TCP LISTEN 的连接,排除掉 ESTABLISHED 等干扰项。
【-c 参数对大小写敏感,必须与 ps 命令中显示的 COMMAND 名完全一致,比如 java 进程常显示为 java 或 node 而非 Node.js】
快速验证某端口是否真被目标软件占用
第一步:用 lsof -i :端口号 查出占用该端口的 COMMAND 和 PID
第二步:用 ps -p PID -o comm= 查看该 PID 对应的精确进程名(去空格、无路径)
第三步:比对这个 comm 值是否属于你怀疑的软件——例如 PID 对应的 comm 是 java,而你刚关掉的是 Spring Boot 应用,那就基本确认了。
如果 ps -p PID -o comm= 返回为空或报错,说明该进程已退出但端口未完全释放(TIME_WAIT 状态残留),此时无需 kill,等待几十秒后重试即可。

















