登录
首页 >  文章 >  linux

Linux下如何用lsof查看文件和端口占用

时间:2026-04-07 10:09:29 375浏览 收藏

本文深入解析了Linux下lsof命令的三大核心应用场景:精准定位端口占用(如用sudo lsof -i :8080避免权限盲区)、快速揪出锁定文件或目录的进程(注意路径完整性与-D/-t等实用选项),以及全面审查指定进程打开的文件和网络连接(善用-p、-R、-a组合提升排查效率);同时直击实战痛点——解释lsof卡顿的真实原因(NFS/DNS阻塞)并给出即插即用的优化方案(-n -N -P),强调“方向比语法更重要”,帮助读者摆脱盲目尝试,在系统资源争用、服务启动失败、磁盘空间异常等常见故障中迅速锁定元凶。

Linux怎么使用lsof命令_Linux如何查看文件和端口占用【技巧】

查哪个进程占用了某个端口(比如 8080)

直接用 lsof -i :8080 就能列出所有监听或连接该端口的进程。注意:普通用户只能看到自己启动的进程,看不到 root 或其他用户的;想看全,得加 sudo

常见错误是只输 lsof -i :8080 却没权限,结果返回空——不是没占用,是看不见。这时候补上 sudo lsof -i :8080 才算完整。

  • -i 表示按网络连接筛选,后面跟协议+端口,比如 :22tcp:443udp:53
  • 如果只想看监听(LISTEN)状态,加 -sTCP:LISTEN,避免混入 ESTABLISHED 连接
  • 输出里 PID 列就是进程号,COMMAND 是程序名,USER 是启动者,三者缺一不可定位

查某个文件或目录被哪些进程打开

lsof /path/to/filelsof /var/log。路径必须写全,不能用通配符(lsof *.log 无效),也不能省略前导斜杠(lsof log 查不到任何东西)。

典型场景:删不掉文件,提示 Device or resource busy;或者 umount 失败,其实都是因为有进程正打开着里面某个文件或子目录。

  • +D 可递归查整个目录树,但性能差、耗时长,慎用:lsof +D /tmp
  • -t 只输出 PID,方便配合 kill,比如 kill $(lsof -t /var/run/nginx.pid)
  • 注意硬链接和符号链接:lsof 显示的是实际打开的 inode,不是 symlink 路径本身

查某个进程打开了哪些文件和端口

lsof -p 1234,其中 1234 是目标进程的 PID。比 pscat /proc/1234/fd 更直观,尤其对网络连接。

容易忽略的是:有些进程会 fork 出子进程并继承 fd,但 lsof -p 默认只查指定 PID 的主线程,不包含子线程或子进程。真要全覆盖,得加 -R(递归查子进程)——但多数时候不需要,先看主线程就够了。

  • -a 可组合多个条件,比如 lsof -a -p 1234 -i 只显示该进程的网络连接
  • 输出中 TXT 类型表示可执行文件(即程序本体),DEL 表示已删除但仍被打开的文件,这类文件磁盘空间不会释放
  • 如果进程已退出但还有残留 fd(比如僵尸句柄),lsof -p 不会显示,得靠 /proc 手动排查

为什么 lsof 没反应或卡住?

最常见原因是它在遍历 NFS 挂载点、或某些异常挂载的文件系统(如 cifs、fuse),导致内核调用阻塞。这不是 bug,是设计使然:lsof 需要读取每个进程的 /proc/PID/fd/ 目录,而某些远程文件系统响应慢或无响应。

解决方法不是等,而是绕开:

  • -n 跳过 DNS 反解(避免卡在 hostname 查询)
  • -N 跳过 NFS 文件系统扫描(NFS 相关条目直接忽略)
  • lsof -P -n 组合,既不解析端口名(如把 22 显示成 ssh),也不解析 IP 主机名,提速明显
  • 如果连 lsof -v 都卡,说明 /proc 本身可能异常,优先检查 mount | grep proc

真正麻烦的从来不是命令怎么写,而是你不确定该查进程、查端口,还是查文件路径——这三个方向对应完全不同的参数组合,错一个就白等几秒。多试两次 lsof -ilsof -p,比背参数有用。

好了,本文到此结束,带大家了解了《Linux下如何用lsof查看文件和端口占用》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多文章知识!

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>