Linux列出进程调用或打开的文件信息(lsof命令)深度指南

在Linux系统管理和故障排查中,了解进程与文件系统之间的交互至关重要。当我们需要诊断资源占用、排查文件锁定问题或分析应用程序行为时,lsof(List Open Files)命令提供了不可替代的强大功能。本技术博客将深入探讨lsof的用法、常见场景和最佳实践,帮助您掌握这个系统管理利器。

目录#

  1. 什么是lsof命令?
  2. 安装lsof工具
  3. lsof基本用法与语法
  4. 常用选项详解
  5. 实际应用场景与示例
  6. lsof输出解析
  7. 最佳实践与技巧
  8. 替代工具与补充方案
  9. 总结
  10. 参考资料

什么是lsof命令?#

lsof全称"List Open Files",但这里的"文件"是广义概念,包括:

  • 常规文件(文本、二进制等)
  • 目录
  • 网络连接(IPv4/IPv6套接字)
  • 共享库
  • 字符/块设备
  • FIFO管道
  • Unix域套接字

当进程打开这些资源时,内核会为其分配文件描述符(File Descriptor),而lsof正是查询这些描述符关联信息的工具。它在这些场景特别有用:

  • 定位文件被哪个进程占用导致无法删除
  • 排查"Device or resource busy"错误
  • 分析应用程序的文件使用情况
  • 网络连接诊断
  • 安全审计和异常检测

安装lsof工具#

大多数Linux发行版默认安装lsof。验证是否安装:

lsof -v

安装方法:#

# Debian/Ubuntu
sudo apt-get install lsof
 
# RHEL/CentOS
sudo yum install lsof
 
# Fedora
sudo dnf install lsof
 
# Arch Linux
sudo pacman -S lsof

lsof基本用法与语法#

基础命令格式:

lsof [options] [names]

不接任何参数:列出所有进程打开的文件(信息量巨大!)

sudo lsof

按用户过滤:-u

lsof -u username

按进程ID过滤:-p

lsof -p PID

常用选项详解#

选项说明示例
-c按进程名匹配lsof -c nginx
-d按文件描述符过滤lsof -d 0-2 (标准I/O)
-i显示网络连接lsof -i :80
-aAND逻辑组合条件lsof -a -u www -i TCP
-t仅输出PID(适合脚本处理)lsof -t /var/log/syslog
-F指定输出格式(便于解析)lsof -F n
-r重复模式(持续监控)lsof -r 5 -i :22
-V显示搜索排除项lsof -V -i

注意:涉及系统级信息查询时通常需要root权限


实际应用场景与示例#

场景1:定位占用文件的进程#

# 查找谁在使用特定文件
sudo lsof /var/log/syslog
 
# 查找目录使用情况(注意尾随斜线)
sudo lsof +D /var/log/

场景2:网络连接分析#

# 列出所有TCP连接
sudo lsof -i TCP
 
# 查看22端口使用
sudo lsof -i :22
 
# 显示指定IP的连接
sudo lsof -i @192.168.1.100

场景3:用户级文件访问审查#

# 查看用户mysql打开的文件
sudo lsof -u mysql
 
# 组合条件:用户apache且状态为DEL(已删除未释放)
sudo lsof -u apache -a -d DEL

场景4:进程级资源分析#

# 查看指定进程ID的所有打开项
sudo lsof -p 1234
 
# 显示nginx进程的TCP连接
sudo lsof -p $(pgrep nginx) -i TCP

场景5:高级组合查询#

# 查找使用80端口的非root进程
sudo lsof -i :80 -a -u ^root
 
# 列出所有IPv4连接+命令行详情
sudo lsof -i 4 -l -R -V

lsof输出解析#

典型输出字段说明:

COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
bash     1234 user  cwd    DIR   8,1     4096 131075 /home/user
sshd     5678 root    3u  IPv4  33421      0t0     TCP *:ssh (LISTEN)
  • COMMAND:进程名(或前15字符)
  • PID:进程ID
  • USER:进程所有者
  • FD:文件描述符(cwd=当前目录,mem=内存映射文件等)
  • TYPE:文件类型(DIR/REG/IPv4/unix等)
  • DEVICE:设备号
  • SIZE/OFF:文件大小/偏移量
  • NODE:Inode号
  • NAME:挂载点或网络地址

特殊FD标识:

  • 0u:标准输入
  • 1w:标准输出
  • 2u:标准错误
  • mem:内存映射文件
  • DEL:已删除但仍被占用

最佳实践与技巧#

  1. 最小化原则

    • 避免裸用lsof(输出过多)
    • 组合过滤条件:lsof -a -u user -i :80
  2. 脚本友好操作

    # 获取占用文件的PID
    pid=$(sudo lsof -t /path/to/file)
     
    # 终止占用80端口的所有进程
    sudo kill $(sudo lsof -t -i :80)
  3. 监控模式诊断

    # 每5秒刷新22端口使用
    sudo lsof -r 5 -i :22
  4. 已删除文件恢复

    # 找到已删除但被占用的文件
    sudo lsof / | grep DEL
     
    # 从/proc恢复(需root)
    cp /proc/1234/fd/15 ~/recovered-file
  5. 安全审计注意

    • 定期检查异常网络连接:lsof -i -n -P
    • 审核敏感文件访问:sudo lsof /etc/passwd
  6. 性能优化

    • 对大数据中心用-F格式化输出提高解析效率
    • 避免递归大型目录(如+D /

替代工具与补充方案#

  1. fuser - 快速查找文件使用者

    fuser -v /path/to/file
  2. ss/netstat - 专注网络连接

    ss -tulpn | grep :80
  3. /proc文件系统 - 手动查询

    ls -l /proc/1234/fd/
    cat /proc/1234/maps
  4. strace - 实时跟踪文件操作

    strace -e trace=file -p 5678

总结#

lsof是Linux系统管理的瑞士军刀,通过本文我们深入探讨了:

  • lsof的核心功能和应用场景
  • 丰富的过滤选项和组合技巧
  • 实际故障排查中的经典用例
  • 输出解析与性能优化建议
  • 相关工具的互补使用

掌握lsof不仅提升故障排查效率,更能深入理解Linux进程与资源的交互原理,是每个系统管理员必备的技能。

行动建议:下次遇到文件占用或资源冲突时,尝试使用lsof代替盲目重启服务!


参考资料#

  1. lsof man page
  2. Linux Documentation Project - lsof
  3. Linux Performance Analysis with lsof
  4. Proc filesystem specification
  5. lsof Cheat Sheet by Red Hat
# 快速参考备忘录
# 基本查询: sudo lsof [选项] [文件/目录]
# 网络:    lsof -i [4|6] [@host][:port]
# 用户:    lsof -u user
# 进程:    lsof -p PID
# 组合:    lsof -a 条件1 条件2