主题
lsof 命令用法整理
简介
lsof(list open files)是一个用于列出当前系统中所有打开文件的命令行工具,它可以帮助我们查看哪些进程正在使用哪些文件、网络连接以及其他资源。通过 lsof 命令,我们可以快速定位系统中的问题,并解决各种与文件相关的问题,例如文件锁定、磁盘空间使用等等。
核心特点
- 一切皆文件:在 Linux 中,socket、管道、设备等都被视为文件
- 实时监控:可查看当前时刻系统资源占用情况
- 排查利器:定位文件占用、端口冲突、进程异常等问题
安装
bash
sudo apt-get install lsofbash
sudo yum install lsofbash
sudo pacman -S lsofbash
sudo zypper install lsof验证安装:
bash
lsof -v
#lsof version information:
# revision: 4.99.4
# ...基础用法
列出所有打开的文件
bash
lsof提示
出现 unknown 表示没有权限查看
查找特定进程打开的文件
bash
lsof -p PIDPID 是进程号
查找特定用户打开的文件
bash
lsof -u USERNAMEUSERNAME 是用户名
查找指定目录下被打开的文件
bash
lsof +D /path/to/directory
# 也可以单独查询单个文件
lsof /path/to/file查看某个端口是否被占用
bash
lsof -i:portport 是要查询的端口号。如果端口被占用,会输出占用端口的进程信息。
输出列说明
| 列名 | 含义 | 示例 |
|---|---|---|
| COMMAND | 进程名称 | nginx |
| PID | 进程 ID | 1234 |
| USER | 运行用户 | www-data |
| FD | 文件描述符 | cwd, txt, 1u |
| TYPE | 文件类型 | REG, DIR, IPv4 |
| DEVICE | 设备号 | 8,1 |
| SIZE/OFF | 文件大小或偏移 | 1024 |
| NODE | 节点号 | 12345 |
| NAME | 文件/连接名称 | /var/log/nginx.log |
FD 文件描述符常见值
cwd: 当前工作目录txt: 程序代码mem: 内存映射文件mmap: 内存映射设备- 数字 + 字母:如
1u表示文件描述符 1,u 表示读写模式
使用实例
场景 1:查找占用端口的进程
bash
# 查看 8080 端口被谁占用
lsof -i:8080
# 结合 grep 过滤
lsof -i:8080 | grep LISTEN场景 2:查找删除后仍被占用的文件
bash
# 查找已删除但仍被进程占用的文件(释放磁盘空间)
lsof | grep deleted
# 示例输出
# nginx 1234 www-data 1w REG 8,1 1024 /var/log/access.log (deleted)场景 3:查看进程打开的文件数量
bash
# 统计每个进程打开的文件数
lsof | awk '{print $1}' | sort | uniq -c | sort -rn | head -20场景 4:监控文件变化
bash
# 持续监控某目录的文件打开情况
watch -n 1 'lsof +D /var/log'场景 5:查找网络连接
bash
# 查看所有 TCP 连接
lsof -i tcp
# 查看已建立的连接
lsof -i tcp -s TCP:ESTABLISHED
# 查看监听端口
lsof -i -s TCP:LISTEN场景 6:强制结束占用文件的进程
bash
# 先查找占用文件的进程
lsof /path/to/file
# 获取 PID 后结束进程
kill -9 $(lsof -t /path/to/file)常用参数汇总
| 参数 | 说明 | 示例 |
|---|---|---|
-p | 指定进程 ID | lsof -p 1234 |
-u | 指定用户 | lsof -u root |
-i | 网络连接 | lsof -i:80 |
-c | 指定命令名 | lsof -c nginx |
+D | 递归目录 | lsof +D /var |
-t | 仅输出 PID | lsof -t file |
-n | 不解析主机名 | lsof -n -i |
-P | 不解析端口名 | lsof -P -i |
相关命令
fuser- 速度快,输出简洁,自带杀进程功能(-k)
- 信息较少
- 快速解决冲突(如卸载 U 盘、删除锁文件)
ps/pgrep- 专注于运行中的程序实例
- 无法直接关联到普通数据文件
- 查看"程序"是否在运行
netstat/ss- 专注于网络连接统计
- 更适合分析网络状态
注意事项
性能影响
- lsof 扫描整个系统,大量文件时执行较慢
- 生产环境避免频繁使用,建议配合
-n -P加速
bash
# 加速查询(不解析主机名和端口名)
lsof -n -P -i:80权限要求
- 普通用户只能查看自己进程的文件
- 查看系统级文件需要使用
sudo - 某些安全策略可能限制 lsof 的使用
最佳实践
- 优先使用
-n -P避免 DNS 解析延迟 - 配合
grep、awk等工具过滤结果 - 大系统先限定范围(用户/进程/目录)再查询
总结
| 特性 | lsof | fuser |
|---|---|---|
| 信息详细度 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
| 执行速度 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| 网络支持 | ✅ | ⚠️ |
| 杀进程 | ❌ | ✅ |
| 适用场景 | 深度排查 | 快速定位 |
- 信息极其详细(用户、命令、文件描述符)
- 系统负载稍高,输出冗长
- 深度排查,需要知道进程在干什么
一句话总结
lsof 是 Linux 系统排查的"瑞士军刀",适合深入分析文件、网络、进程关系,日常配合 -n -P 参数使用可提升效率。