2026年01月25日/ 浏览 8
lsof(List Open Files)是Linux/Unix系统中一款功能强大的诊断工具,用于列出系统中所有打开的文件及相关进程信息。在Linux哲学中,"一切皆文件",这意味着lsof不仅能显示普通文件,还能展示目录、块设备、字符设备、网络套接字、管道、共享库等几乎所有系统资源。掌握lsof能帮助系统管理员和开发者快速解决文件锁定、端口占用、磁盘空间异常等棘手问题,是系统诊断工具箱中的必备利器。
常用选项:
-i:显示网络连接(TCP/UDP)-p:指定进程ID,如 -p 1234-t:只输出进程ID(适用于脚本)-u:指定用户,如 -u username-c:按命令名筛选,如 -c ssh+d:递归列出指定目录下的打开文件-d:指定文件描述符-n:不解析主机名(加快执行速度)-P:不解析端口号(显示数字端口)在Linux系统中,当进程需要访问文件、网络资源或设备时,会通过文件描述符(FD)打开这些资源。每个打开的文件都会在内核中创建一个条目,记录:
打开该文件的进程文件类型与访问模式文件位置与偏移量文件状态标志lsof输出通常包含以下重要列:
COMMAND:进程名称PID:进程IDUSER:进程所有者FD:文件描述符(如0u, 1w, 2r, 3r, txt, mem等)TYPE:文件类型(REG-普通文件, DIR-目录, CHR-字符设备, FIFO-管道, IPv4/IPv6-网络连接)DEVICE:设备号SIZE/OFF:文件大小或偏移NODE:inode号NAME:文件名或网络连接详情问题:尝试卸载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卸载,当设备不再繁忙时自动卸载问题: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问题:启动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问题: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专业人员必须掌握的核心工具。
下期预告:Linux命令专栏第16期将为大家带来tcpdump命令的深度解析。这把网络抓包利器将帮助我们透视网络流量,诊断连接问题,分析协议行为,甚至排查安全事件。敬请期待!