好的,我们来系统讲解一下 lsof 工具,它是 Linux/Unix 系统中非常重要的命令行工具,主要用于查看 系统中被打开的文件。我会从概念、安装、常用用法、实战场景和注意事项全方位说明。
lsof 工具详解
1️⃣ 什么是 lsof?
- 全称:
list open files - 功能:显示当前系统中 打开的文件及相关进程信息
- 为什么叫文件:在 Linux/Unix 中,一切皆文件——普通文件、目录、设备文件、网络连接(socket)都算文件
- 用途:
- 查看进程打开了哪些文件
- 查看文件被哪些进程占用
- 查找端口占用情况
- 解决“文件无法删除或卸载设备”问题
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️⃣ 注意事项
- 需要 root 权限查看其他用户进程打开的文件,否则只能看到自己用户的文件
- 对大系统,直接
lsof会产生大量输出,建议使用grep或参数过滤 - lsof 对 NFS 文件、删除文件、套接字等都能显示,非常适合排错
✅ 总结:
lsof 是 Linux 系统中 排查文件占用、端口冲突、磁盘空间问题的利器,结合 grep、kill、watch 等命令可以快速定位问题。