标签搜索

系统诊断工具lsof详解

mrui
2025-09-12 / 0 评论 / 7 阅读 / 正在检测是否收录...

在Linux系统中,网络连接是文件,设备是文件,管道也是文件,一切皆文件。而lsof的全称是"list open files",即列出打开的文件。

因此lsof就像是系统的"透视镜",能让你看到系统内部正在发生什么。哪个进程打开了哪些文件,哪个端口被哪个程序占用,哪些文件被删除了但还在被进程使用着,这些信息lsof都能告诉你。

基础用法

最简单的用法就是直接输入lsof,不过这样会输出所有打开的文件,信息量太大了,一般不会这么用。
mh2z7m5q.png

输出的每一行代表一个打开的文件,包含了这些信息:

  • COMMAND:进程名称
  • PID:进程ID
  • USER:用户名
  • FD:文件描述符
  • TYPE:文件类型
  • DEVICE:设备号
  • SIZE/OFF:文件大小或偏移量
  • NODE:inode号
  • NAME:文件名或网络连接信息

网络相关用法

查看端口占用情况

# 查看80端口被哪个进程占用
lsof -i:80

# 查看所有TCP连接
lsof -i tcp

# 查看所有UDP连接
lsof -i udp

# 查看指定IP和端口的连接
lsof -i@192.168.1.100:22

查看网络连接状态

# 查看所有网络连接
lsof -i
# 查看指定状态的连接
lsof -i -sTCP:LISTEN  # 查看监听状态的TCP连接
lsof -i -sTCP:ESTABLISHED  # 查看已建立的TCP连接
#这个在排查网络问题的时候特别有用。比如怀疑某个服务连接数过多,就可以用这个命令来确认。

mh2zaax7.png

进程相关的用法

查看进程打开的文件


# 查看指定PID打开的文件
lsof -p 1234

# 查看指定进程名打开的文件
lsof -c nginx

# 查看指定用户打开的文件
lsof -u www-data

查看文件被哪些进程使用

# 查看指定文件被哪些进程打开
lsof /var/log/nginx/access.log

# 查看指定目录下的文件被哪些进程使用
lsof +D /var/log/

文件系统相关

找出被删除但未释放的文件

经常遇到这种情况:明明删除了大文件,但是df显示磁盘空间没有释放。这通常是因为文件被删除了,但还有进程在使用这个文件。

# 查找被删除但未释放的文件
lsof | grep deleted

# 或者更精确的查找
lsof +L1

查看挂载点使用情况

# 查看指定挂载点被哪些进程使用
lsof /mnt/data

# 查看所有挂载点的使用情况
lsof -f -- /dev/sda1

案例分享

排查文件句柄泄漏

某个Python应用运行一段时间后就会报"Too many open files"的错误。怀疑是文件句柄泄漏。

# 先找到进程PID
ps aux | grep python_app

# 查看进程打开的文件数量
lsof -p 12345 | wc -l

# 查看具体打开了哪些文件
lsof -p 12345

发现进程打开了大量的临时文件,而且数量一直在增长。最后定位到是代码里创建临时文件后没有正确清理。

磁盘空间异常问题

服务器磁盘使用率突然飙升到95%,但是找不到大文件。后来用lsof发现有个日志轮转脚本有问题。

排查发现有个进程打开了一个几GB的文件,但是这个文件在文件系统里找不到,原来是被删除了但进程还在写入。

# 查找大文件
lsof | awk '$7 ~ /^[0-9]+$/ && $7 > 1000000 {print $2, $7, $9}' | sort -k2 -nr

高级用法和技巧

组合条件查询

lsof支持多种条件的组合,默认是OR关系,可以用-a参数改为AND关系。

# 查看用户www-data打开的网络连接(OR关系)
lsof -u www-data -i

# 查看用户www-data打开的网络连接(AND关系)
lsof -a -u www-data -i

输出格式控制

# 不显示主机名,直接显示IP
lsof -n -i

# 不显示端口名,直接显示端口号
lsof -P -i

# 组合使用
lsof -nP -i:80

这个在脚本里特别有用,因为解析主机名和端口名会比较慢。

持续监控

# 每2秒刷新一次
lsof -r 2 -i:80

# 监控到没有输出就退出
lsof +r 1 -i:80

这个功能在调试网络连接问题的时候很有用,可以实时看到连接的变化。

性能优化

lsof虽然强大,但是在大型系统上运行可能会比较慢,特别是不加任何参数的时候。有几个优化技巧:

  • 尽量使用具体的参数,避免全量扫描
  • 使用-n和-P参数避免DNS和端口名解析
  • 在脚本中使用时,考虑缓存结果
# 这样比较快
lsof -nP -i:80

# 这样会很慢
lsof | grep :80

常见问题和注意事项

使用lsof的时候有几个坑需要注意:

  • 权限问题:有些信息需要root权限才能看到
  • 系统负载:在高负载系统上运行lsof可能会影响性能
  • 输出解读:要理解各个字段的含义,特别是FD字段
  • FD字段的含义比较复杂:
    cwd:当前工作目录
    txt:程序代码
    mem:内存映射文件
    数字:文件描述符号
    r、w、u:读、写、读写模式

lsof的输出信息比较敏感,包含了很多系统内部的信息。在分享排查过程或者截图的时候,记得做好脱敏处理,避免泄露重要的系统信息。

0

评论 (0)

取消