lsof 命令速查表 - Linux 进程与端口排查常用命令大全

端口被占、文件被锁、磁盘满却找不到大文件——这三类问题的共同点是需要把「一个资源」反查成「哪个进程」,lsof 就干这件事。表按四个维度铺开:By Process 从 PID 反查打开的文件与连接;By Port 从端口找到占用进程;By File 从文件反查持有者;By Type 处理管道、内存映射这类特殊描述符。最被低估的是排障组里的 +L1——普通 df 看不见已删但仍打开的文件,磁盘不会因 rm 释放,必须靠它定位持有句柄的进程并重启。分工很明确:ss 和 netstat 更快但只管网络,fuser 简洁且 -k 能直接杀进程,/proc 是底层真相但要自己拼。权限是前提:非 root 只能看自己的描述符,半张进程表比没有更误导。

系统与运维·共 35 条命令·最后更新 2026-07-21

按进程查找 By Process 6

lsof -p 1234
查看指定 PID 打开的文件
lsof -c nginx
查看 nginx 进程打开的文件
lsof -c /^nginx/
正则匹配进程名
lsof -u tom
查看指定用户打开的文件
lsof -u ^root
排除 root 用户
lsof -p 1234,5678
查看多个进程打开的文件

按端口查找 By Port 6

lsof -i :80
查看占用 80 端口的进程
lsof -i :8080 -i :8443
查看多个端口
lsof -i tcp:80
只查看 TCP 80 端口
lsof -i udp:53
只查看 UDP 53 端口
lsof -i @192.168.1.1:80
查看指定 IP 和端口
lsof -i :1-1024
查看所有特权端口(1-1024)占用

按文件查找 By File 4

lsof /var/log/syslog
查看谁打开了指定文件
lsof +D /var/log/
查看目录下所有打开的文件
lsof +d /var/log/
只查看当前目录(不递归)
lsof /dev/sda1
查看谁在使用指定设备

网络连接 Network 8

lsof -i
查看所有网络连接
lsof -i -n
不解析域名(更快)
lsof -i -P
不解析端口名(显示数字端口)
lsof -i -n -P
组合使用(最快)
lsof -i tcp@192.168.1.1:22
查看到指定主机的 SSH 连接
lsof -i -sTCP:ESTABLISHED
只查看已建立的连接
lsof -i 4 -P -n
只查看 IPv4 连接(不解析加速)
lsof -i 6 -P -n
只查看 IPv6 连接

按文件类型 By Type 4

lsof -t
只输出 PID(方便管道处理)
lsof -F pfc
输出格式化的字段(PID/命令/用户)
lsof -a -p 1234 -c nginx
AND 组合条件
lsof -Or -p 1234 -p 5678
OR 组合条件

常见排障场景 Troubleshooting 7

lsof -i :80 | grep LISTEN
查看 80 端口监听进程
lsof +L1
查看已删除但仍被打开的文件(磁盘满时用)
lsof -nP -iTCP -sTCP:LISTEN
查看所有监听中的 TCP 端口
lsof -i :22 | grep ESTABLISHED
查看已建立的 SSH 连接
lsof -u tom | wc -l
统计用户打开的文件数
kill $(lsof -t -i :8080)
一键杀掉占用 8080 端口的进程
lsof -i :80 -r 5
每 5 秒重复监控 80 端口

命令示例

磁盘满了但 du 看不出原因

lsof +L1

+L1 列出已删除但仍被进程打开的文件。文件被 rm 了但空间没释放,就是因为还有进程持有它。重启对应进程或重启机器才回收。

输出

COMMAND   PID USER   FD   TYPE DEVICE    SIZE/OFF     NODE NAME
nginx     1420  www   12w  REG  254,1  4823445760    1234 /var/log/nginx/access.log (deleted)

查看指定目录下所有被打开的文件

lsof +D /var/log/

+D 递归整个目录,较慢但完整;只想看当前层用 +d。删除或移动文件报 "device or resource busy" 时,这条能直接定位占用进程。

查看所有监听中的 TCP 端口(最快)

lsof -nP -iTCP -sTCP:LISTEN

-n 不解析域名、-P 显示数字端口,配合状态过滤是 lsof 最快的形式。ls 目录量大时输出会很宽,加 | awk 精简列。

输出

COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx     1420  www    6u  IPv4 265781      0t0  TCP *:80 (LISTEN)
node      3120  tom   18u  IPv4 265781      0t0  TCP *:3000 (LISTEN)

常见坑与注意事项

  • lsof 输出量极大,直接跑会刷屏;按 -i、-p、-u 或 +D 限定范围,或接管道过滤。
  • 查看其他用户的进程需要 root,普通用户只能看到自己的。
  • 删除文件报 device or resource busy 时不要强删,先用 lsof 找出占用进程;强删后空间不会释放。
  • lsof +D 递归整个目录在文件极多时非常慢,大目录优先用 lsof | grep。
  • 网络连接排查优先用 ss,它读内核 netlink 比 lsof 快一个数量级。

提示

  • lsof 需要 root 权限才能查看所有用户的文件,普通用户只能看自己的。
  • 端口占用排查:先用 lsof -i :port 找到 PID,再用 kill 杀进程或改配置。
  • 磁盘满但找不到大文件时,用 lsof +L1 找已删除但仍被进程占用的文件。
  • lsof -p <PID> -a -d cwd 可以只看目标进程的当前工作目录,判断「它到底在哪运行」比看 cmdline 更准,尤其是同名进程多开时。
  • lsof -t -i :<端口> 直接输出 PID,方便和 kill 串起来写进一行:kill $(lsof -t -i :3000)。
  • 排查 umount 报 target is busy 时用 lsof +D /挂载点,但要意识到 +D 会全量扫描该目录下的 inode,大目录上很慢,先用 +d 试试。

官方参考来源

下方为命令对应的官方权威文档,供你核对最新用法与深入查阅。

由 巧匠 维护

公开更新于 2026年7月21日,内容持续校对官方文档。

联系我们

命令或描述有误?提交反馈、商务合作或产品建议都可发送邮件给我们。

联系我们