Linux lsof 命令:文件句柄与端口占用排查神器
lsof (List Open Files) 是 Linux 系统管理中不可或缺的瑞士军刀。由于 Linux 遵循“一切皆文件”的设计哲学,无论是普通的文本文件、目录、块设备,还是网络套接字(Socket)、管道(Pipe),在 lsof 眼中都是文件。因此,它是排查“谁占用了这个端口”、“为什么这个文件删不掉”、“哪个进程在疯狂读写磁盘”等问题的终极利器。
最基础的用法
lsof
不加任何参数执行,它会列出当前系统所有进程打开的所有文件。输出内容非常庞大,通常包含 COMMAND, PID, USER, FD, TYPE, DEVICE, SIZE/OFF, NODE, NAME 等列。在实际操作中,我们几乎总是需要配合参数来过滤信息。
实际使用中,高频场景与命令组合
查找占用特定端口的进程
这是 lsof 最著名的用途,常用于解决 Address already in use 错误。
lsof -i :8080
或者指定协议:
lsof -i tcp:3306
这会精确显示哪个进程(PID)正在监听或使用 8080 或 3306 端口,方便你决定是 kill 掉它还是修改配置。
2. 查找特定用户打开的文件
当你需要审计某个用户的操作,或者限制某用户的资源时使用:
lsof -u username
如果要排除某个用户(例如排除 root),可以使用 ^ 符号:
lsof -u ^root
3. 查找被删除但未释放空间的文件
这是排查“磁盘满了但找不到大文件”的经典场景。当文件被删除但仍有进程持有其句柄时,磁盘空间不会释放。
lsof | grep deleted
找到这些文件后,重启对应进程或 kill 掉持有句柄的进程,空间就会瞬间释放。
4. 查看某个目录下被打开的文件
lsof +D /var/log
这会递归查找 /var/log 目录下所有被进程打开的文件。注意:如果目录很大,这个命令可能会比较慢。
5. 持续监控文件打开情况
lsof -r 5 -i :80
-r 5 表示每隔 5 秒重复执行一次。这在调试间歇性网络连接或观察服务启动过程时非常有用。
如果不知道如何下手,可以先尝试
lsof -c nginx
通过进程名(COMMAND)来过滤。如果你知道出问题的服务叫 nginx、mysql 或 java,直接搜名字是最快的方式。
或者,如果你想知道某个具体的物理文件或设备被谁锁定了:
lsof /path/to/specific/file
- 点赞
- 收藏
- 关注作者
评论(0)