lsof -p PID 是查看进程打开文件最常用可靠方式,覆盖所有文件类型;可加 -n -P 加速,用 -a -d ^cwd,^txt,^mem 过滤非普通文件;支持按进程名、路径、删除文件等多维度排查。

直接用 lsof -p PID 就能查出指定进程打开的所有文件,这是最常用也最可靠的方式。它覆盖普通文件、目录、套接字、共享库、设备节点等全部类型,输出清晰,配合少量过滤参数就能快速定位问题。
按进程 ID 查看所有打开的文件
知道进程 PID 后,执行:
-
sudo lsof -p 1234(替换为实际 PID) - 加
-n -P避免 DNS 和服务名解析,加快输出:sudo lsof -n -P -p 1234 - 如只关心实际读写的普通文件,可排除 cwd(当前目录)、txt(程序代码)、mem(内存映射):
sudo lsof -p 1234 -a -d ^cwd,^txt,^mem
输出中重点关注 NAME 列(路径)和 FD 列(如 3u 表示第 3 号描述符、读写状态),TYPE 列为 REG 的多为常规文件。
按进程名批量查看打开的文件
不确定 PID,但知道服务名(如 nginx、java、mysqld)时:
-
sudo lsof -c nginx—— 匹配命令名以nginx开头的所有进程 - 多个进程名一起查:
sudo lsof -c sshd -c crond - 注意:
-c是前缀匹配,不是全名精确匹配;若需更准,可结合ps aux | grep先确认完整命令名
查某个文件被哪些进程占用
当文件无法删除、修改或卸载目录失败时,直接查路径:
-
lsof /var/log/nginx/access.log—— 显示所有打开该文件的进程 -
lsof +d /tmp—— 扫描/tmp目录下一级中被打开的文件(不含子目录,速度快) -
lsof +D /var/log—— 递归扫描整个目录树(权限要求高,可能中断)
特别注意:cwd 或 rtd 类型的条目表示进程工作目录或根目录设在该路径下,也会导致 umount 失败,不能只盯着 REG 文件。
查已删除但仍被占用的文件(磁盘空间不释放)
日志轮转后 df 显示满、du 却不大?大概率是文件被 rm 了但进程还拿着句柄:
-
lsof | grep deleted—— 快速列出所有标记为(deleted)的条目 - 输出 NAME 列类似
/var/log/app.log (deleted),对应 PID 即为持有者 - 释放空间只需重启该进程,或向其发送
SIGHUP(若支持平滑重载)
不复杂但容易忽略。











