Linux lsof 命令:文件句柄与端口占用排查神器

举报
yd_232564628 发表于 2026/09/27 10:52:33 2026/09/27
【摘要】 lsof (List Open Files) 是 Linux 系统管理中不可或缺的瑞士军刀。由于 Linux 遵循“一切皆文件”的设计哲学,无论是普通的文本文件、目录、块设备,还是网络套接字(Socket)、管道(Pipe),在 lsof 眼中都是文件。因此,它是排查“谁占用了这个端口”、“为什么这个文件删不掉”、“哪个进程在疯狂读写磁盘”等问题的终极利器。 最基础的用法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
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。