首页/网络/网络排障速查/端口被谁占用:lsof 与 fuser 定位

端口被谁占用:lsof 与 fuser 定位

端口冲突或安全审计时定位占用者:lsof -i 与 fuser -n tcp 给出 PID、用户与可执行文件,比 ss -p 更直观。

网络排障速查网络更新于 2026-10-13

lsof 与 fuser 是什么

lsof -i 列出进程打开的套接字,直接给出占用端口的 PID、用户与可执行文件;fuser -n tcp 只吐 PID,适合脚本里取号。两者都是从 /proc/<pid>/fd 反查套接字 inode,因此只能看到被进程持有的连接:处于 TIME-WAIT 的残留套接字没有属主进程,查不到是正常的,不要因此认定工具失效。

基本信息

适用平台Linux(macOS 自带 lsof);Windows 用 netstat -ano
标准语法lsof -i :8080 / fuser -n tcp 8080
权限要求查其他用户的进程需 root,普通用户只能看到自己的进程
安装依赖lsof 非最小化安装自带:Debian/Ubuntu apt install lsof,RHEL 系 yum install lsof
无 lsof 时的替代ss -tlnp 'sport = :8080'

典型使用场景

  • 服务启动报 bind 失败,先确认端口到底被谁占着
  • 安全巡检:核对对外监听端口的属主是否都在预期清单内
  • 容器环境里宿主机端口被 docker-proxy 或 kube-proxy 占用,判断能否改端口
  • 查找已被删除但仍占用磁盘空间的文件(lsof | grep deleted)
  • 核对进程真实性:用 /proc/<pid>/exe 与 /proc/<pid>/cmdline 看可执行文件与启动参数

定位占用者

定位占用者
lsof -i :8080                       # 列出该端口所有相关套接字
lsof -iTCP:8080 -sTCP:LISTEN        # 只保留 LISTEN 行,过滤掉客户端连接
lsof -i :8080 -P -n                 # 关闭端口名/服务名解析,输出更快更稳定
fuser -n tcp 8080                   # 只输出 PID,便于脚本取号
ss -tlnp 'sport = :8080'            # 未安装 lsof 时的替代写法
ls -l /proc/<PID>/exe               # 该 PID 对应的可执行文件绝对路径

输出逐列读法

列含义判读要点
COMMAND进程名,默认截断 15 字符名字被截断时用 ps -p <PID> -o cmd= 看完整命令行
PID进程号同一进程可能有多行,对应多个套接字
USER进程属主非 root 用户监听公网端口时重点核实来源
TYPE套接字类型(IPv4/IPv6)IPv4 与 IPv6 各一行属双栈监听,正常现象
NAME本地地址:端口 与状态带 (LISTEN) 才是监听方;带 -> 的是已建立的客户端连接
TIME-WAIT 套接字没有归属进程,lsof/fuser 都查不到,要用 ss -tan state time-wait 'sport = :8080' 查。重启服务后仍报占用,通常是旧进程没退干净,而不是 TIME-WAIT 本身。
在容器环境里宿主机看到的监听者可能是 docker-proxy 或 kube-proxy,属正常转发进程;先 docker ps 或 kubectl get svc 对照,再决定是否改配置。

易错点

  • 看到 lsof 第一行就下结论:输出里常混着已建立的客户端连接,必须先筛出 (LISTEN) 那一行,否则会误判占用者
  • fuser 漏写 -n tcp:参数被当作文件路径解释,输出无意义甚至直接报错
  • 用普通用户执行:别人的进程不可见,容易得出「端口没人占用」的假结论,排查方向被带偏
  • 查到占用者立刻 kill -9:容器端口映射进程或守护进程会马上拉起新实例,故障复发且现场更难复现;应先确认服务归属再处置

数据来源与参考

  • man 8 lsof
  • man 1 fuser
  • man 8 ss

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌