Linux命令专栏第15期:文件侦探!lsof命令详解与实战

2026年01月25日/ 浏览 9

Linux命令专栏第15期:文件侦探!lsof命令详解与实战

一、命令简介

lsof(List Open Files)是Linux/Unix系统中一款功能强大的诊断工具,用于列出系统中所有打开的文件及相关进程信息。在Linux哲学中,"一切皆文件",这意味着lsof不仅能显示普通文件,还能展示目录、块设备、字符设备、网络套接字、管道、共享库等几乎所有系统资源。掌握lsof能帮助系统管理员和开发者快速解决文件锁定、端口占用、磁盘空间异常等棘手问题,是系统诊断工具箱中的必备利器。

二、基本语法

lsof [选项] [参数]

常用选项:

-i:显示网络连接(TCP/UDP)-p:指定进程ID,如 -p 1234-t:只输出进程ID(适用于脚本)-u:指定用户,如 -u username-c:按命令名筛选,如 -c ssh+d:递归列出指定目录下的打开文件-d:指定文件描述符-n:不解析主机名(加快执行速度)-P:不解析端口号(显示数字端口)

三、核心概念

1. 文件与进程的关系

在Linux系统中,当进程需要访问文件、网络资源或设备时,会通过文件描述符(FD)打开这些资源。每个打开的文件都会在内核中创建一个条目,记录:

打开该文件的进程文件类型与访问模式文件位置与偏移量文件状态标志

2. 关键列解析

lsof输出通常包含以下重要列:

COMMAND:进程名称PID:进程IDUSER:进程所有者FD:文件描述符(如0u, 1w, 2r, 3r, txt, mem等)TYPE:文件类型(REG-普通文件, DIR-目录, CHR-字符设备, FIFO-管道, IPv4/IPv6-网络连接)DEVICE:设备号SIZE/OFF:文件大小或偏移NODE:inode号NAME:文件名或网络连接详情

3. 文件描述符(FD)含义

0u/1w/2r:标准输入/输出/错误(u-读写, r-只读, w-只写)txt:程序代码(文本段)mem:内存映射文件rtd:根目录cwd:当前工作目录DEL:Linux删除的文件(仍在使用)

四、实用示例

1. 基础用法

# 列出所有打开的文件(需要root权限查看全部) lsof # 列出特定用户打开的文件 lsof -u nginx # 列出特定进程打开的文件 lsof -p 1234 # 仅显示PID(适用于脚本) lsof -t -i :80

2. 文件相关操作

# 查找谁在使用特定文件 lsof /var/log/syslog # 列出被删除但仍被进程占用的文件 lsof | grep deleted # 递归列出目录中打开的文件 lsof +d /usr/bin # 显示所有打开的配置文件 lsof | grep \.conf$

3. 网络连接分析

# 列出所有网络连接 lsof -i # 显示特定端口的连接 lsof -i :80 lsof -i :ssh # 显示特定协议的连接 lsof -i tcp lsof -i udp # 查看特定IP的连接 lsof -i @192.168.1.100 # 同时过滤协议和端口 lsof -i tcp:80

五、高级技巧

1. 问题诊断组合拳

# 查找并终止占用特定端口的所有进程 kill -9 $(lsof -t -i :3000) # 找出无法卸载文件系统的占用进程 lsof /mnt/usb_drive # 识别磁盘空间被删除文件占用 lsof +L1 # 显示链接数为0(已删除)但仍在使用的文件 # 结合grep过滤特定类型 lsof -i -nP | grep ESTABLISHED # 查看所有建立的TCP连接

2. 系统安全监控

# 查找所有网络监听进程 lsof -i -sTCP:LISTEN # 监控可疑的外连行为 lsof -i -nP | grep :443 (ESTABLISHED) | grep -v :443-> # 检测隐藏的rootkit lsof -i | grep -v 127.0.0.1 | grep -v localhost | grep -i hidden

3. 资源泄漏检测

# 跟踪进程打开文件数变化(诊断文件描述符泄漏) watch -n 1 "lsof -p 1234 | wc -l" # 查找大文件内存映射 lsof -p 1234 | awk $7 ~ /^[0-9]+[a-z]?$/ {print $0} | sort -k7 -hr | head -5

六、实战案例

1. 解决"设备忙"无法卸载问题

问题:尝试卸载USB驱动器时提示"device is busy"。

解决

# 确定占用设备的进程 lsof /mnt/usb # 输出示例 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 2345 user cwd DIR 8,1 4096 12 /mnt/usb/documents

解决方案

# 退出相关进程或使用lazy卸载 umount -l /mnt/usb # lazy卸载,当设备不再繁忙时自动卸载

2. 诊断磁盘空间异常

问题:df显示磁盘空间不足,但du显示使用量不大。

分析

# 查找已删除但仍被进程占用的大文件 lsof | grep deleted | awk {sum+=$7; print $9,$7,$2,$1} END {print "Total: " sum/1024/1024 " GB"} # 输出示例 /var/log/app.log (deleted) 524288000 1234 appserver Total: 0.5 GB

解决方案

# 重启占用已删除文件的进程 systemctl restart appserver

3. 端口冲突排查

问题:启动Web服务时提示端口8080已被占用。

解决

# 确定占用端口的进程 lsof -i :8080 -sTCP:LISTEN # 输出示例 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME node 12345 user 20u IPv6 123456 0t0 TCP *:8080 (LISTEN) # 强制终止进程 kill -9 12345

4. 数据库连接泄漏诊断

问题:MySQL数据库连接数达到上限,无法接受新连接。

分析

# 统计各进程的MySQL连接数 lsof -i :3306 | awk NR>1 {print $1,$2,$9} | sort | uniq -c | sort -nr # 输出示例 25 java 12345 10.0.0.5:3306->mysql-server:3306 12 python 67890 10.0.0.6:3306->mysql-server:3306 1 mysqld 54321 mysql-server:3306->10.0.0.5:54321

解决方案

调查连接数异常高的Java应用,发现数据库连接未正确关闭,修复代码中的连接池配置。

七、小结

lsof作为Linux系统中功能最全面的文件与进程关系分析工具,能够帮助我们:

快速诊断文件系统问题,如无法卸载设备、磁盘空间异常排查网络问题,识别端口冲突、异常连接和安全威胁定位资源泄漏,包括文件描述符泄漏和内存映射问题深入理解进程行为,无需重启服务即可了解系统状态与kill、grep、awk等命令组合,构建强大的自动化诊断脚本

熟练掌握lsof将显著提升系统管理效率,将复杂问题的诊断时间从小时级缩短到分钟级,是每个Linux专业人员必须掌握的核心工具。

八、性能与安全注意事项

lsof在大型系统上可能消耗较多资源,避免在生产高峰时段执行无过滤的全系统扫描需要root权限才能查看所有进程的打开文件,普通用户只能看到自己的文件生产环境中应谨慎使用kill $(lsof -t ...)这类命令,确保不会误杀关键进程与-n和-P选项结合使用可大幅提高执行速度,尤其在DNS解析缓慢的环境中定期更新lsof版本,以获得最新内核特性的支持和安全修复

下期预告:Linux命令专栏第16期将为大家带来tcpdump命令的深度解析。这把网络抓包利器将帮助我们透视网络流量,诊断连接问题,分析协议行为,甚至排查安全事件。敬请期待!

picture loss