直接用 sudo lsof -i :端口号 查端口占用,必须加 sudo 才能查看所有进程;加 -p -n 可避免服务名解析和 dns 卡顿,输出中 pid 和 command 列即对应占用进程;查所有监听 tcp 端口用 sudo lsof -itcp -stcp:listen -p -n;终止进程可用 sudo kill -9 $(sudo lsof -t -i :端口号)。

直接用 sudo lsof -i :端口号 就能查出哪个进程占用了指定端口,关键是要加 sudo 权限,否则可能看不到系统级进程。
查单个端口(比如 8080)
运行命令:
sudo lsof -i :8080 -P -n
-P 防止把端口号转成服务名(如 8080 不显示为 http-alt),-n 避免 DNS 解析卡顿或乱码。输出中重点关注 PID 和 COMMAND 列,就能知道是哪个进程在监听或连接该端口。
查所有正在监听的 TCP 端口
想一次性看清哪些端口被谁监听,用:
sudo lsof -iTCP -sTCP:LISTEN -P -n
- -iTCP 限定只看 TCP 协议
- -sTCP:LISTEN 只显示处于 LISTEN 状态的套接字(即服务端正在等待连接)
- 搭配 -P -n 保证输出简洁、可读性强
快速获取 PID 并终止进程
如果只想杀掉占用端口的进程,可以组合使用:
sudo kill -9 $(sudo lsof -t -i :3000)
-
-t 参数让 lsof 只输出 PID,适合管道传递给
kill - 注意:-t 不带 sudo 可能返回空,务必加权限
- 先试
kill -15(优雅退出),再考虑-9强制终止
常见问题与绕过方法
有时执行 lsof -i :端口 没有结果,可能是以下原因:
- 没加
sudo—— 普通用户看不到其他用户的进程 - 端口确实没被监听,而是被其他进程 连接中(ESTABLISHED)—— 去掉 -sTCP:LISTEN 再试
- 用了 UDP 协议 —— 改用
-iUDP或直接-i查所有协议 - 防火墙或容器网络导致端口映射不直观 —— 结合
ss -tulnp或netstat -tulnp交叉验证











