怎样使用lsof查看打开的文件?

常见问题

怎样使用lsof查看打开的文件?

2026-01-01 03:00


掌握Linux系统

                                            

掌握Linux系统监控利器:详解lsof命令查看打开文件的多种方法

在Linux系统管理和故障排查中,了解哪些文件正在被哪些进程使用是至关重要的。无论是释放被占用的磁盘空间、解决“设备或资源忙”错误,还是进行安全审计,lsof(List Open Files)命令都是系统管理员和开发者手中不可或缺的瑞士军刀。本文将深入浅出地解析lsof命令的用法,帮助您高效地查看系统中所有打开的文件。

一、 lsof命令基础:不仅仅是“文件”

首先需要理解的是,在Linux中“一切皆文件”。因此,lsof所列出的“打开文件”范围非常广泛,包括:

  • 普通文件:如文本、图片、数据文件。
  • 目录:被进程打开的目录。
  • 块设备与字符设备文件
  • 管道(FIFO)和命名管道。
  • 网络套接字(Socket):包括TCP、UDP连接等。
  • 库文件(.so文件)

理解这个概念,是灵活运用lsof的基石。

二、 核心用法实战:从简单到复杂

1. 直接运行lsof

不带任何参数直接输入lsof,会列出系统中所有进程打开的所有文件。信息量巨大,通常需要配合过滤命令使用。

lsof | head -20  # 查看前20行输出,了解信息结构

2. 查看指定进程打开的文件

使用-p选项后接进程ID(PID)是最常用的场景之一。

lsof -p 1234  # 查看PID为1234的进程打开的所有文件

您也可以结合pgrep命令动态查找进程ID:

lsof -p $(pgrep nginx)  # 查看所有nginx进程打开的文件

3. 查看指定用户打开的文件

使用-u选项可以按用户筛选。

lsof -u www-data  # 查看用户www-data打开的所有文件

排除某个用户,在用户名前加^符号:

lsof -u ^root  # 查看除root用户外所有用户打开的文件

4. 查看指定程序打开的文件

使用-c选项后接程序名(或命令名的一部分)。

lsof -c sshd  # 查看所有sshd进程打开的文件
lsof -c mysql -c apache2  # 查看mysql或apache2进程打开的文件

5. 查看指定目录或文件被谁占用

这是解决“无法删除”或“无法卸载”问题的关键。直接在命令后加上文件或目录的路径。

lsof /var/log/syslog  # 查看谁正在使用/var/log/syslog文件
lsof /home/user/important_folder/  # 查看谁打开了此目录
lsof /dev/sda1  # 查看哪个进程正在访问/dev/sda1设备

6. 网络连接相关查询

lsof在排查网络问题时威力巨大。

lsof -i  # 列出所有网络连接
lsof -i :80  # 查看所有使用80端口的连接
lsof -i tcp:22  # 查看所有TCP 22端口(SSH)的连接
lsof -i @192.168.1.100  # 查看与指定IP地址相关的所有连接
lsof -i udp  # 查看所有UDP连接

三、 组合过滤与高级技巧

1. 组合选项

lsof的选项可以组合使用,实现精确过滤。

lsof -u nginx -i :80  # 查看用户nginx打开的所有80端口网络连接
lsof -c java -a -d txt  # 查看所有java进程打开的文本描述符(-a表示AND)

2. 使用-d选项按文件描述符过滤

文件描述符(FD)是进程访问文件的句柄。

lsof -d 0-2  # 查看所有进程的标准输入(0)、输出(1)、错误(2)
lsof -d mem  # 查看内存映射文件
lsof -d txt  # 查看所有进程加载的代码文件(如程序本身、库)

3. 杀死占用文件的进程

结合kill命令,可以强制释放被占用的资源。

# 谨慎操作!此命令会杀死所有打开/var/log/apache2/error.log的进程
kill -9 $(lsof -t /var/log/apache2/error.log)

其中-t选项使lsof只输出PID,方便管道传递。

4. 查看文件系统的打开文件

使用+D(递归)和+d(非递归)选项查看目录。

lsof +D /var/log/  # 递归查看/var/log/目录下所有被打开的文件

四、 输出解读与关键列

理解lsof的输出列含义,才能准确分析:

  • COMMAND:进程名称。
  • PID:进程ID。
  • USER:进程所有者。
  • FD:文件描述符。如cwd(当前工作目录)、txt(程序代码)、mem(内存映射文件)、数字(如0,1,2,3等)或IPv4等。
  • TYPE:文件类型(REG-普通文件,DIR-目录,IPv4-网络套接字等)。
  • DEVICE:设备号。
  • SIZE/OFF:文件大小或偏移量。
  • NODE:文件的Inode号。
  • NAME:文件或连接的具体路径、端口号等。

五、 典型应用场景总结

  1. 磁盘空间未释放:删除大文件后,df显示空间未增加?用lsof | grep deleted查找已被删除但仍被进程占用的文件,重启相应进程即可释放。
  2. 卸载设备失败:提示“设备正忙”?使用lsof /mount_pointlsof /dev/device_name找出占用进程。
  3. 网络端口冲突:服务启动失败,提示端口被占用?使用lsof -i :端口号快速定位罪魁祸首。
  4. 安全排查:检查异常网络连接或可疑进程打开了哪些文件。
  5. 性能分析:查看某个进程是否打开了过多文件或异常的网络连接。

掌握lsof命令,就如同为您的Linux系统装上了一双“透视眼”。它从文件描述符这一底层视角,清晰揭示了进程与系统资源之间的动态关联。建议在日常工作中多加练习,将这些命令组合融入您的排查流程,定能极大提升系统管理和问题诊断的效率与精度。


标签:
  • lsof command
  • Linux system monitoring
  • open files troubleshooting
  • 莱卡云