lsof -i 是查端口占用最直接可靠的方案,支持按端口(如 lsof -i :8080)或 PID(如 lsof -p 1234)查询,需注意权限、加 -n 避免 DNS 解析卡顿,以及区分 LISTEN 和 ESTABLISHED 状态。

查进程占用了哪个端口,lsof -i 是最直接、最可靠的方案,不用猜、不依赖 netstat(已逐步弃用),也不用翻 /proc 下一堆文件。
查某个进程 PID 占了哪些端口
先拿到 PID(比如用 ps aux | grep nginx),再用 lsof -p <code>PID 查它打开的所有网络连接和监听端口。注意:必须有权限——普通用户看不到其他用户的进程,root 才能全量查看。
-
lsof -p 1234输出里找LISTEN或ESTABLISHED状态的行,NAME列末尾的:端口号就是它在用的端口 - 如果只关心 TCP 监听,加
-iTCP过滤:lsof -p 1234 -iTCP - 常见坑:没加
-n时,lsof会尝试反向解析 IP 和主机名,卡顿几秒甚至超时;建议默认带上-n关闭 DNS 查询
查某个端口被哪个进程占用
比如发现 8080 启不起来,怀疑被占了,直接搜端口:lsof -i :8080。这是最常用也最容易忽略参数细节的操作。
-
lsof -i :8080能同时匹配 IPv4 和 IPv6 的8080端口;如果只想看 IPv4,写成lsof -i4 :8080 - 若输出为空,不代表端口空闲——可能你没权限看那个进程(比如 root 运行的服务),换
sudo lsof -i :8080再试 - 注意区分
LISTEN(监听中)和ESTABLISHED(已建立连接):只有LISTEN表示端口正被绑定等待接入
为什么不用 netstat 或 ss?
netstat 在多数新发行版里已被标记为 deprecated(如 Ubuntu 22.04+、RHEL 8+),且输出字段含义模糊、默认不显示 PID(需加 -tulpn 才勉强可用);ss 虽快但 PID 显示不稳定(尤其容器环境),而且 ss -tulnp 的 p 字段常为空,得配合 /proc 手动查。
-
lsof -i天然带 PID 和进程名,格式统一,跨发行版兼容性好 - 性能上无明显劣势:对单个端口或 PID 查询,
lsof是按需扫描,不是全量枚举 - 一个容易被忽略的点:某些精简镜像(如 Alpine)默认不带
lsof,得手动apk add lsof;别等到线上出问题才想起装
真正麻烦的不是命令怎么敲,而是权限、DNS 解析、IPv4/IPv6 混合匹配这些隐性条件——它们不出错时不显眼,一出错就让人反复试半小时。










