进程打开文件、把文件映射到内存,或把某个目录用作当前工作目录,都可能让文件系统保持忙碌状态。lsof 和 fuser 可以帮助识别这些关系。应先检查;是否停止进程是另一项会产生实际运行影响的决定。
进程利用率 · 第 2 课
lsof 和 fuser
学习如何识别正在使用文件、目录、挂载点和网络套接字的进程。
使用 lsof 列出打开的文件
lsof 意为“列出打开的文件”(list open files)。查询路径可以看到匹配的打开文件记录:
$ sudo lsof -- /mnt/usb
若要递归查询同一文件系统中的整棵目录树,常见实现支持 +D,但递归扫描可能代价很高:
$ sudo lsof +D /mnt/usb
常用列包括 COMMAND、PID、USER、文件描述符(FD)、类型、设备和 NAME。FD 为 cwd 的记录表示进程把该目录用作当前工作目录。对于其他用户拥有的进程,非特权用户看到的输出可能不完整。
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,而应遵循审慎的顺序:
- 确认主机、路径、挂载源和计划进行的维护。
- 实际可行时,同时使用这两个工具识别进程。
- 判断每个进程能否停止、移出该目录,或等待其自行完成。
- 如果服务管理器或应用接口可用,应通过它们停止进程。
- 再次查询,然后卸载并验证结果。
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 和访问信息。确认挂载点,并考虑权限和竞态。
在考虑发送信号前,先协调有序停止。
再次查询,并验证卸载或服务操作的结果。