🧭说明
lsof 是一个功能极其强大的 Linux 诊断工具,全称是 Li st O pen F iles。在 Linux 中"一切皆文件",因此它可以列出所有进程打开的所有资源,包括普通文件、目录、网络连接、管道、设备等。
🎯 核心功能与常用示例
掌握以下几个最常用的命令格式,可以解决绝大多数问题。
| 场景 | 命令示例 | 作用说明 |
|---|---|---|
| 1. 查看端口占用 | sudo lsof -i :8080 |
查看谁占用了 8080 端口。 |
| 2. 查看进程打开的文件 | sudo lsof -p 1234 |
查看 PID 为 1234 的进程打开了哪些文件。 |
| 3. 查看文件被谁占用 | sudo lsof /path/to/file |
查看某个具体文件或目录被哪些进程使用。 |
| 4. 查看用户打开的资源 | sudo lsof -u username |
查看指定用户打开的所有文件。 |
| 5. 查看网络连接 | sudo lsof -i |
列出所有网络连接(类似 netstat)。可配合 -iTCP 或 -iUDP 指定协议。 |
| 6. 查看命令打开的文件 | sudo lsof -c sshd |
查看所有 sshd 进程打开的文件。 |
📊 解读输出信息
lsof 的输出信息量很大,理解各列含义是关键。以下是几个核心列:
| 列名 | 说明 |
|---|---|
| COMMAND | 进程的名称。 |
| PID | 进程的 ID。 |
| USER | 进程所有者的用户名。 |
| FD | 文件描述符 ,是关键信息。常见值:cwd(当前目录)、txt(程序代码)、mem(内存映射文件)、数字(如 0u 标准输入,1u 标准输出,2u 标准错误),3u 等为其他文件。 |
| TYPE | 文件类型,如 REG(普通文件)、DIR(目录)、IPv4(IPv4 网络套接字)。 |
| DEVICE | 设备号。 |
| SIZE/OFF | 文件大小或偏移量。 |
| NODE | 文件的 Inode 号。 |
| NAME | 文件或网络连接的具体路径、地址和端口。 |
⚙️ 进阶组合技巧
lsof 可以与其他命令组合,实现更精确的查询。
-
组合查询 :选项可以叠加使用。例如,查看用户
nginx的所有 TCP 网络连接:bashsudo lsof -u nginx -iTCP -
杀死占用进程 :结合
kill命令,强制释放被占用的资源(请谨慎操作)。bashsudo kill -9 $(sudo lsof -t -i :3000)-t选项仅输出 PID,方便管道传递。 -
查找已删除但未释放的文件 :当磁盘空间不足,但
df和du结果不一致时,可能是某个大文件被进程锁定并删除。此时文件在文件系统中不可见,但进程仍持有其句柄,空间未被释放。bashsudo lsof | grep deleted找到对应的 PID 和 FD,重启该进程即可释放空间。
⚠️ 重要注意事项
- 权限 :
lsof需要足够的权限才能查看所有信息,因此查询系统级信息时通常需要sudo。 - 输出量 :直接运行
lsof会列出所有信息,输出可能非常冗长。务必结合上述选项进行过滤。 - 网络状态 :
-i选项输出的连接状态与netstat类似,如LISTEN(监听)、ESTABLISHED(已建立)。
lsof 是系统管理和故障排查的"瑞士军刀"。当遇到"文件被占用无法删除"、"端口冲突"或"磁盘空间神秘消失"等问题时,它通常是解决问题的第一步。