Linux lsof 命令完全指南:从入门到精通

Linux lsof 命令完全指南:从入门到精通

Someone Lv5

引言

lsof(List Open Files)是 Linux 系统管理员手中最强大的诊断工具之一。在 Linux 中,”一切皆文件”——普通文件、目录、网络套接字、管道、设备文件等都被视为文件。lsof 可以列出当前系统中所有被打开的文件,是定位连接问题、排查资源泄漏、分析进程行为的必备利器。

本文将全面介绍 lsof 的安装、基本用法、高级技巧及实战场景。


安装 lsof

大多数 Linux 发行版默认已安装 lsof,若未安装:

1
2
3
4
5
6
7
8
# Debian/Ubuntu
sudo apt install lsof -y

# RHEL/CentOS/Fedora
sudo dnf install lsof -y

# Alpine
apk add lsof

验证安装:

1
lsof --version

基础用法

1. 列出所有打开的文件

1
lsof

输出结果很多,建议使用其他选项过滤。输出字段说明:

字段含义
COMMAND打开文件的进程名
PID进程 ID
TID线程 ID(如果适用)
USER进程所有者
FD文件描述符(cwd/rtd/txt/mem/数字等)
TYPE文件类型(REG/DIR/CHR/IPv4/0000等)
DEVICE设备号
SIZE/OFF文件大小或偏移量
NODE索引节点号
NAME文件路径或连接信息

2. 查看特定用户打开的文件

1
2
lsof -u username
lsof -u xinyu

排除某个用户:

1
lsof -u ^root

3. 查看特定进程的文件

1
2
3
4
5
lsof -p PID
lsof -p 1234

# 多个 PID
lsof -p 1234,5678

4. 查看特定端口的进程

1
2
3
4
5
# 查看 80 端口
lsof -i :80

# 查看端口范围
lsof -i :1-1024

5. 查看特定协议的连接

1
2
3
4
5
6
7
8
9
# TCP 连接
lsof -i TCP

# UDP 连接
lsof -i UDP

# IPv4 或 IPv6
lsof -i 4
lsof -i 6

6. 查看特定状态的口

1
2
3
4
5
# 查看 LISTEN 状态的端口
lsof -i TCP -s TCP:LISTEN

# 查看已建立的连接
lsof -i TCP -s TCP:ESTABLISHED

常用选项详解

选项作用示例
-i显示网络连接lsof -i :443
-p按 PID 过滤lsof -p 1000
-u按用户过滤lsof -u nginx
-c按命令名过滤lsof -c nginx
-d按文件描述符过滤lsof -d 1-5
-t仅输出 PID(用于脚本)lsof -t -i :80
+D递归列出目录下所有打开的文件lsof +D /var/log
-r重复模式(刷新),n 秒后再次执行lsof -r 5 -i :443
-n不执行 DNS 反向解析(加快速度)lsof -n -i
-P不将端口号转换为服务名lsof -P -i
-s按协议状态过滤lsof -i TCP -s TCP:LISTEN
-F机器可解析的输出格式lsof -F pcfn -i :80

实战场景

场景 1:查看端口被哪个进程占用

这是最常用的场景——启动服务时发现端口已被占用:

1
2
3
4
5
6
7
8
9
10
# 查看 80 端口
lsof -i :80

# 输出示例
# COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
# nginx 12345 root 6u IPv4 123456 0t0 TCP *:80 (LISTEN)

# 如果只想看 PID(配合 kill)
lsof -t -i :8080
kill -9 $(lsof -t -i :8080)

场景 2:找出文件被哪个进程使用

当需要卸载文件系统或删除文件时,报错”设备或资源忙”:

1
2
3
4
5
6
7
8
# 查看 /var/log 中哪些文件被打开
lsof +D /var/log

# 查看特定文件
lsof /var/log/nginx/access.log

# 结合 grep 快速定位
lsof | grep /var/log | head -20

场景 3:监控网络连接

1
2
3
4
5
6
7
8
# 持续监控端口 443
lsof -r 3 -i :443

# 查看所有 ESTABLISHED 连接
lsof -i TCP -s TCP:ESTABLISHED

# 查看监听端口列表(排除 DNS 反解加速)
lsof -nP -i TCP -s TCP:LISTEN

场景 4:诊断数据库连接问题

1
2
3
4
5
6
7
8
# 查看 MySQL 的所有连接
lsof -u mysql -i

# 查看特定数据库客户端的所有连接
lsof -i :3306

# 查看进程持有的文件数(排查文件描述符泄漏)
lsof -p $(pgrep mysqld) | wc -l

场景 5:查找已删除但仍在占用的文件

某些进程还在使用已被删除的文件,导致磁盘空间未释放:

1
2
3
4
5
6
7
8
9
# 查找已删除但仍在打开的文件
lsof | grep '(deleted)'

# 更精确的查找
lsof -nP | grep '(deleted)' | awk '{print $2, $1, $NF}'

# 重启对应进程即可释放空间
# 如果确认无影响,kill 后重载
kill -HUP $(lsof -t /var/log/nginx/access.log)

场景 6:排查文件描述符泄漏

长时间运行的服务可能出现文件描述符泄漏:

1
2
3
4
5
6
7
8
9
10
# 实时监控某进程的 FD 数量
while true; do
count=$(lsof -p 1234 | wc -l)
echo "$(date) - FD count: $count"
sleep 10
done

# 如果持续增长,说明存在泄漏
# 查看进程当前 FD 限制
cat /proc/1234/limits | grep "open files"

场景 7:配合其他命令组合使用

1
2
3
4
5
6
7
8
# 查看 Nginx 的工作进程网
lsof -i :80 -c nginx

# 查看所有监听端口及对应进程
lsof -nP -i TCP -s TCP:LISTEN | awk 'NR>1 {print $1, $2, $9}'

# 统计每个用户打开的文件数
lsof | awk 'NR>1 {count[$3]++} END {for(u in count) print u, count[u]}' | sort -k2 -rn | head -10

进阶技巧

1. 重复执行模式

类似 watch 命令,内置周期刷新:

1
2
3
4
5
# 每 3 秒刷新一次
lsof -r 3 -i :80

# 执行指定次数后退出
lsof -r 5 -c nginx

2. 脚本化输出(-t 和 -F)

1
2
3
4
5
6
# 仅输出 PID,方便脚本处理
kill -9 $(lsof -t -i :8080)

# 自定义输出字段
# -F 后跟字段标识:p=PID, c=COMMAND, f=FD, n=NAME
lsof -F pcfn -i :443

3. 查看 Unix 域套接字

1
lsof -U

4. 查看所有 NFS 文件

1
lsof -N

5. 查看当前工作目录(cwd)

1
lsof -d cwd -u nginx

性能与安全注意事项

  1. 权限问题:普通用户只能查看自己的进程,root 可以查看所有进程。如果需要让普通用户执行完整 lsof,需要设置 SUID 或使用 sudo。

  2. 性能影响:在高并发服务器上执行无参数的 lsof 可能会产生较大 I/O 开销,建议总是带上过滤条件。

  3. 加速查询

    1
    2
    # 组合使用 -n(不反解 DNS)和 -P(不反解端口)
    lsof -nP -i :80
  4. 安全限制:某些系统上 /proc 的访问权限可能受 hidepid 挂载选项限制。


常见问题排查

问题原因解决方法
lsof: no permission权限不足使用 sudo
输出为空没有匹配项确认端口/进程号是否正确
响应缓慢DNS 反向解析-n 选项
端口被占用但 lsof 找不到可能是其他用户或 root 进程使用 sudo 重试
FD 类型显示为 DEL文件已被删除但仍被打开重启相关进程
lsof: WARNING: /proc filesystem .../proc 未挂载或不可读检查 mount | grep proc

命令速查表

需求命令
查看端口占用lsof -i :端口号
查看某个进程的文件lsof -p PID
查看某个用户的文件lsof -u 用户名
查看某个命令打开的文件lsof -c 命令名
查看所有监听端口lsof -nP -i TCP -s TCP:LISTEN
查看已建立连接lsof -i TCP -s TCP:ESTABLISHED
查看目录下打开的文件lsof +D /目录路径
查看已删除文件的进程lsof -nP | grep '(deleted)'
仅输出 PIDlsof -t -i :端口
持续监控lsof -r 秒数 -i :端口

总结

lsof 是一个功能极其强大的诊断工具,掌握了它,就等于拥有了一把打开 Linux 系统”黑盒”的钥匙。无论是排查端口冲突、定位磁盘空间未释放、诊断网络连接问题,还是分析进程文件描述符泄漏,lsof 都能快速给出答案。结合 -n-P-t 等选项灵活组合使用,可以让日常运维工作事半功倍。

本文由AI辅助生成,内容仅供参考

  • 标题: Linux lsof 命令完全指南:从入门到精通
  • 作者: Someone
  • 创建于 : 2026-06-11 19:56:00
  • 更新于 : 2026-06-18 08:39:57
  • 链接: https://demo-blog.qusite.cn/2026-06-11-lsof-command-guide/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。