lsof 和 fuser
100%

进程利用率 · 第 2 课

lsof 和 fuser

学习如何识别正在使用文件、目录、挂载点和网络套接字的进程。

进程打开文件、把文件映射到内存,或把某个目录用作当前工作目录,都可能让文件系统保持忙碌状态。lsoffuser 可以帮助识别这些关系。应先检查;是否停止进程是另一项会产生实际运行影响的决定。

使用 lsof 列出打开的文件

lsof 意为“列出打开的文件”(list open files)。查询路径可以看到匹配的打开文件记录:

$ sudo lsof -- /mnt/usb

若要递归查询同一文件系统中的整棵目录树,常见实现支持 +D,但递归扫描可能代价很高:

$ sudo lsof +D /mnt/usb

常用列包括 COMMANDPIDUSER、文件描述符(FD)、类型、设备和 NAMEFDcwd 的记录表示进程把该目录用作当前工作目录。对于其他用户拥有的进程,非特权用户看到的输出可能不完整。

FD 列中的 cwd 表示什么?

使用 fuser 识别使用者

fuser 会报告正在使用指定文件或文件系统的进程 ID。详细输出还会显示用户、访问类型和命令名称:

$ sudo fuser -v /mnt/usb

如果要把参数视为已挂载文件系统,并查找访问其中任意文件的进程,可以使用 procps fuser 支持的挂载选项:

$ sudo fuser -vm /mnt/usb

应使用 findmnt --target /mnt/usb 等工具确认该路径确实是目标挂载点。绑定挂载、命名空间、权限和竞态都会影响单次查询能够发现的内容。

调查时为什么要使用 fuser -v,而不是普通的 fuser

处理忙碌的文件系统

不要立即杀死所有匹配的 PID,而应遵循审慎的顺序:

  1. 确认主机、路径、挂载源和计划进行的维护。
  2. 实际可行时,同时使用这两个工具识别进程。
  3. 判断每个进程能否停止、移出该目录,或等待其自行完成。
  4. 如果服务管理器或应用接口可用,应通过它们停止进程。
  5. 再次查询,然后卸载并验证结果。

fuser -k 会向匹配的进程发送信号。在常见的 procps 实现中,它默认发送 SIGKILL,因此无法实现有序关闭。如果确实需要执行已明确批准的终止操作,应选择适当信号、核实 PID 和所有者,并认识到从检查到执行操作期间,匹配的进程集合可能发生变化。

为什么 fuser -k /mnt/usb 不适合作为排障的第一步?

选择工具

需要查看详细的打开文件记录、描述符或套接字信息时,使用 lsof。需要从路径出发查看匹配 PID 和访问类型时,使用 fuser。任何一个工具的结果都不能单独说明某个进程可以安全终止。

对于网络套接字,应为 fuser 指定明确的协议命名空间,或使用 ss 等专用套接字工具:

$ sudo fuser -v 22/tcp
$ sudo ss -lntp

哪个工具适合详细列出打开的文件描述符及其所属进程?

课程已完成

你已完成 lsof 和 fuser

现在,你可以调查文件和文件系统的使用情况,而不会把终止进程当作默认处理方式。

  • 使用 lsof 查看详细的打开文件记录。

  • 使用 fuser 获取以路径为中心的 PID 和访问信息。

  • 确认挂载点,并考虑权限和竞态。

  • 在考虑发送信号前,先协调有序停止。

  • 再次查询,并验证卸载或服务操作的结果。

保存学习进度

创建免费账户即可保存本课进度,并在任意设备上继续学习。

创建免费账户
下一节
返回 进程利用率