如何在Linux中安装并使用Lsof命令 Linux查看系统所有打开文件的方法

2026-06-03电脑数码5280

普通用户执行lsof看不到其他进程,因需读取/proc/PID/fd/和内核内存,默认仅限自身进程;必须用sudo才能查看全系统进程,否则输出可能为空或不完整。

lsof 不是“安装后就能直接用”的命令——它需要权限、参数筛选和对输出字段的基本识别能力,否则 lsof 会卡住、报错或返回一堆无用信息。

为什么普通用户执行 lsof 看不到其他进程?

因为 lsof 要读取 /proc/PID/fd/ 和内核内存,普通用户默认只能看到自己启动的进程。不加 sudo 时,lsof 输出可能为空或只显示几个 shell 进程。

  • 必须用 sudo lsof 才能查全系统(尤其是服务类进程如 nginxmysqld
  • 某些容器环境或加固系统(如 grsecurity)即使 root 也可能被限制,此时可退而求其次用 /proc/PID/fd/ 手动验证
  • lsof -v 可确认当前版本是否支持你的内核;老版本(如 4.87 以前)在较新 kernel 上可能 crash

lsof -p PID 查指定进程打开的文件,但没结果?

常见原因不是命令写错,而是权限或进程状态问题:

  • 先确认 PID 确实存在:kill -0 PIDps -p PID,避免查已退出的僵尸 PID
  • 必须加 sudosudo lsof -p 1234,否则连 cwdtxt 都看不到
  • FD 列中 cwd 是当前工作目录,txt 是二进制文件本身,DEL 或 NAME 后带 (deleted) 表示文件已被 rm 但进程仍在写入——这是磁盘空间不释放的典型信号
  • 如果只想看真实磁盘文件(排除 socket、pipe、inotify),加过滤:sudo lsof -p 1234 -a -d ^cwd,^txt,^mem,^rtd,^mmap

lsof +D /path 扫描目录时卡死或超时?

+D 是递归扫描整个目录树,遇到大日志目录(如 /var/log/journal)或 NFS 挂载点极易卡住:

CentOS Linux 7.9.2009

CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离线兼容性测试。

下载

  • 优先用小写 +d(只扫一级):sudo lsof +d /var/log
  • 路径含空格或特殊字符时,必须用引号:sudo lsof "/mnt/my data/app.log",否则 shell 拆分后 lsof 收到的是无效参数
  • 若目标只是卸载失败的挂载点,先 sudo lsof +d /mount/point,再 kill -TERM PID 终止持有句柄的进程,比暴力 umount -f 更安全
  • +D 在某些内核上会触发大量 stat() 调用,导致 I/O 阻塞;生产环境慎用

lsof -i :8080 显示多个进程,怎么确认哪个真在监听?

-i 匹配所有 TCP/UDP 关联该端口的连接(包括 ESTABLISHED、LISTEN、CLOSE_WAIT),但真正“占用端口”的只有 LISTEN 状态:

  • 加状态过滤:sudo lsof -iTCP -sTCP:LISTEN -P -n :8080-P 禁用端口名解析,-n 禁用 DNS 解析,提速且避免卡在反向查询)
  • NAME 列末尾的 (LISTEN) 才表示该进程正在监听;(ESTABLISHED) 是已建立的客户端连接,不冲突
  • 如果输出里有 javanode 同时出现,注意看 USER 字段:可能是不同用户下的进程,sudo 下才可见全貌
  • 某些代理或容器网络(如 Docker 的 bridge 模式)会让 lsof 显示宿主机上看似无关的进程,此时需结合 docker pspodman ps 交叉验证

实际排查时,最常被忽略的是 FD 字段的含义和权限前提——lsof 不是“运行即得结果”的工具,它更像一个需要配合 pskill/proc 目录手动验证的诊断链条。

《如何在Linux中安装并使用Lsof命令 Linux查看系统所有打开文件的方法.doc》

下载本文的Word格式文档,以方便收藏与打印。