好的,我们来系统讲解一下 lsof 工具,它是 Linux/Unix 系统中非常重要的命令行工具,主要用于查看 系统中被打开的文件。我会从概念、安装、常用用法、实战场景和注意事项全方位说明。


lsof 工具详解

1️⃣ 什么是 lsof?

  • 全称list open files
  • 功能:显示当前系统中 打开的文件及相关进程信息
  • 为什么叫文件:在 Linux/Unix 中,一切皆文件——普通文件、目录、设备文件、网络连接(socket)都算文件
  • 用途
    1. 查看进程打开了哪些文件
    2. 查看文件被哪些进程占用
    3. 查找端口占用情况
    4. 解决“文件无法删除或卸载设备”问题

2️⃣ 安装 lsof

大部分 Linux 发行版默认带有 lsof,如果没有可以手动安装:

# Ubuntu / Debian
sudo apt install lsof

# CentOS / RHEL / Fedora
sudo yum install lsof

安装完成后:

lsof -v

可查看版本信息。


3️⃣ lsof 输出结构

执行 lsof 会显示类似以下表格:

COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
bash     1234  root  cwd   DIR  8,1    4096     2   /
python   2345  user  txt   REG  8,1   12345  56789  /usr/bin/python3

  • COMMAND:进程名
  • PID:进程 ID
  • USER:进程所有者
  • FD(File Descriptor):文件描述符
    • cwd:当前工作目录
    • txt:程序文本(可执行文件)
    • mem:内存映射文件
    • 0,1,2:标准输入、输出、错误
  • TYPE:文件类型
    • REG:普通文件
    • DIR:目录
    • CHR:字符设备
    • FIFO:管道
    • SOCK:socket 套接字
  • DEVICE:设备号
  • SIZE/OFF:文件大小或偏移
  • NODE:inode 节点
  • NAME:文件路径或网络连接信息

4️⃣ 常用用法

4.1 查看系统所有打开文件

lsof

文件非常多,通常结合 grep 或分页工具 less 使用。


4.2 查看某个进程打开的文件

lsof -p <PID>
# 例:查看 PID 为 1234 的进程
lsof -p 1234


4.3 查看某个用户打开的文件

lsof -u <用户名>
# 例:查看 user 打开的文件
lsof -u user


4.4 查看某个文件被哪些进程占用

lsof /path/to/file
# 例:查看 /var/log/syslog 被哪些进程打开
lsof /var/log/syslog


4.5 查看某个端口被占用情况(网络连接)

# 查看 TCP 端口 80
lsof -i TCP:80

# 查看所有网络连接
lsof -i

输出中:

  • COMMAND:进程名
  • PID:进程号
  • USER:进程所有者
  • FD:文件描述符(例如 TCP 表示网络套接字)
  • NAME:IP:端口信息

4.6 查看某个协议(TCP/UDP)占用情况

lsof -i TCP
lsof -i UDP

可加上 -nP 参数避免域名解析,提高速度:

lsof -i TCP -nP


4.7 查看被删除但仍被占用的文件

在 Linux 中,文件被删除后,如果有进程仍然打开该文件,占用空间不会释放:

lsof | grep deleted

常用于排查 磁盘空间不释放 问题。


4.8 按文件类型筛选

lsof -d <FD>
# 例:查看所有目录类型
lsof -d cwd


4.9 持续监控文件变化

结合 watch

watch -n 2 'lsof -p 1234'

每 2 秒刷新一次 PID 为 1234 的文件状态。


5️⃣ 实战案例

案例 1:查看端口被占用

lsof -i TCP:3306
# 查到 mysqld 占用端口 3306,可以用于排查数据库启动失败

案例 2:释放被占用的日志文件

lsof /var/log/nginx/access.log
# 找到 PID 后
kill -9 <PID>

注意:强制杀进程可能影响服务,需要谨慎操作。

案例 3:查找删除但占用的文件释放空间

lsof | grep deleted
# 找到占用文件的 PID
kill -HUP <PID>  # 通常通过发送 HUP 信号让进程释放文件句柄


6️⃣ 常用参数总结

参数作用
-p指定进程
-u指定用户
-i查看网络连接
-nP网络查看时不解析域名,显示端口号
-d文件描述符过滤
+D <目录>查看某个目录下被打开的文件
-t只显示 PID(方便结合 kill 使用)
-c按进程名过滤
-r每 N 秒刷新显示(监控)

7️⃣ 注意事项

  1. 需要 root 权限查看其他用户进程打开的文件,否则只能看到自己用户的文件
  2. 对大系统,直接 lsof 会产生大量输出,建议使用 grep 或参数过滤
  3. lsof 对 NFS 文件、删除文件、套接字等都能显示,非常适合排错

总结

lsof 是 Linux 系统中 排查文件占用、端口冲突、磁盘空间问题的利器,结合 grep、kill、watch 等命令可以快速定位问题。