Linux系统故障排查利器lsof:从磁盘泄露到端口占用的实战指南

lsofLinux系统排查磁盘空间泄露
于 2026-07-07 15:30:14 修改
·本内容遵循CC 4.0 BY-SA版权协议

这次我们来看一个 Linux 系统管理员和开发工程师必备的排查工具——lsof。当服务器磁盘空间莫名其妙被占满,或者端口被占用导致服务无法启动时,lsof 往往是解决问题的关键。这个命令虽然看起来简单,但在生产环境救火中能发挥巨大作用。

lsof 的全称是"list open files",在 Linux 系统中,一切皆文件,包括普通文件、目录、网络连接、设备文件等。lsof 能够列出当前系统打开的所有文件,以及打开这些文件的进程信息。这对于排查磁盘空间泄露、文件句柄泄漏、端口占用等问题至关重要。

本文会重点演示如何使用 lsof 排查磁盘空间泄露问题,同时也会覆盖端口占用、文件句柄泄漏等常见场景的排查方法。无论你是运维工程师、开发人员还是系统管理员,掌握 lsof 都能让你的故障排查效率大幅提升。

1. 核心能力速览

能力项 说明
主要功能 列出系统打开的文件和对应的进程信息
适用系统 Linux、Unix、macOS 等类 Unix 系统
资源需求 系统自带工具,无需额外安装,对系统资源占用极低
排查场景 磁盘空间异常、端口占用、文件句柄泄漏、网络连接排查
输出格式 可读的文本格式,支持各种过滤和排序选项
权限要求 普通用户只能查看自己的进程,root 用户可查看所有进程

2. 适用场景与使用边界

lsof 主要适用于以下场景:

磁盘空间泄露排查:当 df -h 显示磁盘使用率很高,但 du -sh 逐层检查却找不到大文件时,很可能是被删除的文件仍然被进程占用,导致空间无法释放。lsof 可以找到这些"幽灵文件"。

端口占用排查:服务启动时报"Address already in use"错误,lsof 可以快速定位是哪个进程占用了特定端口。

文件句柄泄漏:系统报"too many open files"错误时,lsof 可以统计各进程打开的文件数量,找到文件句柄泄漏的元凶。

网络连接分析:查看特定进程建立了哪些网络连接,或者特定端口被哪些连接使用。

使用边界方面,lsof 是一个诊断工具,不会修改系统状态。但需要注意权限问题:普通用户只能查看自己权限范围内的进程和文件信息,要获取完整系统视图需要 root 权限。

3. 环境准备与前置条件

3.1 系统环境要求

  • Linux 发行版(CentOS、Ubuntu、Debian 等)
  • Unix 系统(FreeBSD、Solaris 等)
  • macOS 系统
  • 需要 bash 或兼容的 shell 环境

3.2 安装检查

大多数 Linux 系统都预装了 lsof,可以通过以下命令检查:

BASH
which lsof
lsof -v

如果系统没有安装,可以使用包管理器安装:

BASH
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install lsof
 
# CentOS/RHEL
sudo yum install lsof
 
# macOS
brew install lsof

3.3 权限准备

为了获得完整的系统信息,建议使用 root 权限运行 lsof:

BASH
sudo lsof

或者切换到 root 用户:

BASH
sudo -i
lsof

4. lsof 基础用法与常用参数

4.1 基本命令格式

BASH
lsof [选项] [文件名或目录]

4.2 常用参数说明

BASH
# 查看所有打开的文件
lsof
 
# 查看特定用户打开的文件
lsof -u username
 
# 查看特定进程打开的文件
lsof -p PID
 
# 查看特定端口的使用情况
lsof -i :8080
 
# 查看特定协议和端口
lsof -i tcp:80
 
# 查看被删除但仍被进程占用的文件
lsof +L1

4.3 输出列含义解析

lsof 输出的典型列包括:

  • COMMAND:进程名称
  • PID:进程ID
  • USER:进程所有者
  • FD:文件描述符
  • TYPE:文件类型
  • DEVICE:设备号
  • SIZE/OFF:文件大小或偏移量
  • NODE:节点号
  • NAME:文件名

5. 磁盘空间泄露排查实战

5.1 问题现象识别

当出现以下情况时,很可能存在磁盘空间泄露:

  1. df -h 显示磁盘使用率接近 100%
  2. du -sh / 逐层检查却找不到大文件
  3. 删除文件后磁盘空间没有释放
  4. 系统日志出现 "No space left on device" 错误

5.2 排查步骤详解

步骤1:确认磁盘空间状态

BASH
# 查看磁盘使用情况
df -h
 
# 查看根目录大小
du -sh /

步骤2:查找被删除但仍被占用的文件

BASH
# 查找所有被删除但仍被进程占用的文件
sudo lsof +L1
 
# 或者更精确的查找
sudo lsof | grep deleted

步骤3:分析排查结果 输出示例:

TEXT
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 1234 appuser 1w REG 253,0 10485760 1234567 /var/log/app.log (deleted)
nginx 5678 root 3w REG 253,0 52428800 8912345 /tmp/nginx_cache (deleted)

这里显示:

  • Java 进程(PID 1234)占用了已删除的日志文件,大小约 10MB
  • Nginx 进程(PID 5678)占用了已删除的缓存文件,大小约 50MB

步骤4:处理方案 根据实际情况选择处理方式:

BASH
# 方案1:重启相关进程(最常用)
sudo systemctl restart application-service
 
# 方案2:清空文件内容(如果进程需要继续运行)
sudo truncate -s 0 /proc/1234/fd/1
 
# 方案3:通知进程重新打开文件
sudo kill -HUP 1234

5.3 批量处理脚本

对于需要定期清理的场景,可以创建自动化脚本:

BASH
# !/bin/bash
# cleanup_deleted_files.sh
 
echo "查找被删除但仍被占用的文件..."
sudo lsof +L1 | awk '/REG.*deleted/ {print $2, $9}' | while read pid filename; do
echo "处理PID $pid 占用的文件: $filename"
# 根据进程名决定处理方式
process_name=$(ps -p $pid -o comm= 2>/dev/null)
case $process_name in
java|tomcat)
echo "重启Java进程 $pid"
sudo kill -9 $pid
;;
nginx|apache)
echo "重新加载Web服务器配置"
sudo kill -HUP $pid
;;
*)
echo "手动检查进程 $process_name (PID: $pid)"
;;
esac
done

6. 端口占用排查实战

6.1 常见端口冲突场景

  • 服务启动时报 "Address already in use"
  • 无法绑定到特定端口
  • 需要确认端口监听状态

6.2 端口排查命令

BASH
# 查看特定端口占用
sudo lsof -i :8080
 
# 查看TCP端口占用
sudo lsof -i tcp:80
 
# 查看UDP端口占用
sudo lsof -i udp:53
 
# 查看所有网络连接
sudo lsof -i

6.3 端口占用处理示例

输出示例:

TEXT
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 123 root 6u IPv4 12345 0t0 TCP *:http (LISTEN)
java 456 appuser 12u IPv6 67890 0t0 TCP localhost:8080 (LISTEN)

处理方案:

BASH
# 优雅停止进程
sudo kill -TERM 123
 
# 强制停止进程
sudo kill -9 456
 
# 或者重新配置服务使用不同端口

7. 文件句柄泄漏排查

7.1 文件句柄泄漏现象

  • 系统报 "too many open files" 错误
  • 服务异常崩溃
  • 系统性能下降

7.2 泄漏排查方法

BASH
# 查看各进程打开的文件数量
sudo lsof | awk '{print $1}' | sort | uniq -c | sort -nr
 
# 查看特定进程打开的文件详情
sudo lsof -p PID
 
# 查看系统文件句柄限制
ulimit -n
 
# 查看系统级文件句柄使用情况
cat /proc/sys/fs/file-nr

7.3 泄漏处理策略

BASH
# 临时提高限制
ulimit -n 65536
 
# 永久修改限制
echo "* soft nofile 65536" >> /etc/security/limits.conf
echo "* hard nofile 65536" >> /etc/security/limits.conf
 
# 重启有泄漏的进程
sudo systemctl restart problematic-service

8. 高级用法与技巧

8.1 组合查询技巧

BASH
# 查看特定用户打开的网络连接
lsof -u username -i
 
# 查看特定目录下被打开的文件
lsof +D /path/to/directory
 
# 查看特定文件类型的打开情况
lsof -t filename
 
# 组合查询示例:查找被删除的大文件
lsof +L1 | awk '$7 > 1000000 {print}'

8.2 输出格式控制

BASH
# 重复模式输出,便于监控
lsof -r 5
 
# 仅输出PID,便于脚本处理
lsof -t -i :8080
 
# 自定义输出格式
lsof -F pcfn

8.3 性能优化技巧

BASH
# 限制搜索范围提高速度
lsof -c java # 只查Java进程
lsof -u appuser # 只查特定用户
lsof /var/log # 只查特定目录
 
# 避免全系统扫描
lsof /specific/path

9. 资源占用与性能观察

9.1 lsof 自身资源占用

lsof 是一个轻量级工具,但在扫描大量文件时可能消耗较多资源:

BASH
# 监控lsof运行时的资源占用
time sudo lsof > /dev/null
 
# 查看lsof执行时间
/usr/bin/time -v lsof

典型资源占用:

  • CPU:短期峰值,通常很快完成
  • 内存:取决于系统打开文件的数量
  • I/O:主要涉及读取 /proc 文件系统

9.2 系统级文件句柄监控

建立长期监控机制:

BASH
# !/bin/bash
# file_handle_monitor.sh
 
while true; do
timestamp=$(date '+%Y-%m-%d %H:%M:%S')
total_handles=$(cat /proc/sys/fs/file-nr | awk '{print $1}')
echo "[$timestamp] 当前打开文件句柄数: $total_handles"
# 检查是否接近系统限制
max_handles=$(cat /proc/sys/fs/file-max)
if [ $total_handles -gt $((max_handles * 80 / 100)) ]; then
echo "警告:文件句柄使用率超过80%"
echo "Top 进程文件打开数:"
lsof | awk '{print $1}' | sort | uniq -c | sort -nr | head -10
fi
sleep 60
done

10. 常见问题与排查方法

10.1 权限相关问题

TEXT
问题:lsof: WARNING: can't stat() nfs4 file system
原因:无权限访问网络文件系统或特殊文件系统
解决:使用root权限运行,或检查文件系统挂载状态

10.2 性能相关问题

TEXT
问题:lsof运行缓慢或卡住
原因:系统打开文件数量过多,或网络文件系统响应慢
解决:
1. 限制查询范围:lsof -c process_name
2. 避免扫描网络文件系统
3. 使用更精确的过滤条件

10.3 输出解读问题

TEXT
问题:看不懂lsof输出中的FD列
解释:
cwd:当前工作目录
txt:程序文本文件
mem:内存映射文件
0u:标准输入(0),读写模式(u)
1w:标准输出(1),写模式(w)

10.4 完整问题排查表格

问题现象 可能原因 排查命令 解决方案
磁盘空间不足但找不到大文件 文件被删除但仍被进程占用 lsof +L1 重启相关进程或清空文件
端口被占用无法启动服务 其他进程监听相同端口 lsof -i :端口号 停止占用进程或更换端口
系统报"too many open files" 文件句柄泄漏 lsof -p PID 优化代码或调整系统限制
服务异常崩溃 资源泄漏或文件权限问题 lsof -c 服务名 检查日志和文件权限
网络连接异常 连接数过多或端口冲突 lsof -i 优化连接管理或调整配置

11. 最佳实践与使用建议

11.1 日常监控实践

建立定期检查机制,预防问题发生:

BASH
# !/bin/bash
# daily_lsof_check.sh
 
LOG_FILE="/var/log/lsof_monitor.log"
 
echo "=== lsof 日常检查 $(date) ===" >> $LOG_FILE
 
# 检查被删除的大文件
echo "1. 被删除但仍占用的大文件:" >> $LOG_FILE
sudo lsof +L1 | awk '$7 > 104857600 {print}' >> $LOG_FILE # 大于100MB
 
# 检查网络端口占用
echo "2. 关键端口占用情况:" >> $LOG_FILE
for port in 80 443 8080 3306 5432; do
echo "端口 $port:" >> $LOG_FILE
sudo lsof -i :$port >> $LOG_FILE
done
 
# 检查文件句柄使用趋势
echo "3. 文件句柄统计:" >> $LOG_FILE
cat /proc/sys/fs/file-nr >> $LOG_FILE

11.2 故障排查流程

建立标准化的排查流程:

  1. 问题确认:使用 df、du 确认磁盘空间状态
  2. 快速定位:使用 lsof +L1 查找被删除的文件
  3. 影响评估:根据文件大小和进程重要性决定处理方式
  4. 安全处理:选择重启进程或清空文件的方案
  5. 根本解决:分析泄漏原因,优化程序逻辑或配置

11.3 自动化处理脚本

对于常见问题,可以建立自动化处理:

BASH
# !/bin/bash
# auto_cleanup.sh
 
THRESHOLD=90
CURRENT_USAGE=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')
 
if [ $CURRENT_USAGE -gt $THRESHOLD ]; then
echo "磁盘使用率 ${CURRENT_USAGE}% 超过阈值 ${THRESHOLD}%,开始清理..."
# 查找并处理被删除的大文件
sudo lsof +L1 | awk '$7 > 104857600 {print $2}' | sort -u | while read pid; do
process_name=$(ps -p $pid -o comm= 2>/dev/null)
echo "重启进程: $process_name (PID: $pid)"
sudo kill -TERM $pid
sleep 2
sudo kill -KILL $pid 2>/dev/null
done
# 清理临时文件
find /tmp -type f -mtime +7 -delete
fi

11.4 安全注意事项

  • 生产环境操作前做好备份
  • 优先尝试优雅停止进程(kill -TERM)
  • 确认进程重要性,避免影响业务
  • 记录操作日志,便于问题追溯
  • 定期审查自动化脚本的逻辑

lsof 是每个 Linux 系统管理员的必备工具,掌握它能够快速定位和解决各种文件相关的问题。建议将文中的排查方法和脚本保存备用,在遇到磁盘空间异常、端口冲突等问题时能够快速应对。特别是磁盘空间泄露排查场景,lsof 往往是解决问题的最后手段,值得深入学习和实践。

Linux命令大全】lsof命令深度解析系统监控与故障排查利器
本文深度解析Linuxlsof命令,它是系统监控与故障排查利器。介绍了lsof的工作机制、高级诊断技巧,包括网络连接、文件系统和进程资源分析。还阐述了企业级应用场景、输出格式控制、性能优化技巧,提供常见问题解决方案、安全加固指南及速查手册,给出学习路线与资源。
全息架构师
1181
Linux故障排查使用find命令进行问题定位
![【Linux故障排查使用find命令进行问题定位](https://sobolsoft.com/findfilelength/images/ss.png)# 1. Linux系统故障排查概述在现代信息技术领域,Linux系统凭借其开放源代码、稳定性和安全性等优势,成为了企业服务器和数据中心的首选操作系统。然而,就像任何复杂的系统一样,Linux系统也可能出现故障。当出现系统故障时,有效地进行故障排查是至关重要的。本文将概述Linux系统故障排查的工作流程,重点介绍`find`命令的使用方法和技巧,以及如何利用`find`命令来定位和解决系统中出现的问题。在进行故障排查前,理解
SW_孙维
系统崩溃时如何快速定位问题Debian Linux故障排查
![系统崩溃时如何快速定位问题Debian Linux故障排查](https://ask.qcloudimg.com/http-save/yehe-1844341/sx3fcoes0n.jpeg)# 1. Debian Linux系统故障排查概述## 1.1 故障排查的重要性与目的在现代信息技术领域,Debian Linux系统作为开源社区中的一员,广泛应用于服务器、桌面系统和嵌入式设备。作为系统管理员或IT专业人员,掌握故障排查的基本原理和实践方法,对于保障系统稳定运行、提高服务可用性至关重要。本章节主要概述了故障排查的重要性与目的,介绍了基本的故障排查流程,并强调了预处理和预防
SW_孙维
Linux性能调优与故障排查
# 1. Linux性能监控与分析工具## 1.1 top命令的使用与分析在Linux系统中,top命令是一个常用的实时性能监控工具,可以实时查看系统中各个进程的资源占用情况,以及CPU、内存的利用率等信息。具体使用方法如下```shell$ top```运行top命令后,可以看到类似如下的实时监控界面```top - 17:46:39 up 1 day, 1:30, 2 users, load average: 0.00, 0.01, 0.05Tasks: 121 total, 1 running, 120 sleeping, 0 stopped
吴雄辉
Unix_Linux系统故障排除Harley Hahn的高效诊断流程
SW_孙维
【纸老虎系统故障排除秘籍】全面排查问题与修复的详细流程
SW_孙维
【宿舍管理系统故障排查定位与解决问题的方法论
SW_孙维
Zkteco智慧系统故障排除ZKTime5.0专家带你解决常见问题
SW_孙维
UNIX疑难杂症诊断攻略问题排查与解决技巧,速效方案
SW_孙维
【故障排查与解决】OpenHarmony文件系统问题定位与处理秘籍
SW_孙维
DALSA学习笔记故障排查快速定位问题的方法与工具,让故障无所遁形
SW_孙维