lsof -n -p -p pid 是查指定进程打开文件的正确用法,必须加 -n(禁dns解析)和 -p(禁端口名解析)以避免卡顿、空输出或误判;普通用户需 sudo 查系统进程;可加 -a -d ^cwd,^txt,^mem 过滤非i/o类文件;lsof -c name 按命令名匹配,大小写敏感;底层验证可用 /proc/pid/fd/。

直接用 lsof -p PID 就能列出进程打开的所有文件,但默认输出慢、杂乱、权限受限——关键不是“能不能查”,而是“查得准不准、快不快、有没有漏”。
查指定 PID 打开的文件:必须加 -n -P 避免卡顿和误判
不加参数的 lsof -p 1234 可能卡几秒,甚至返回空(尤其 DNS 不通或端口解析失败时),因为默认会反向解析 IP 和端口名。
- 加
-n跳过主机名解析 - 加
-P跳过端口名解析
例如:sudo lsof -n -P -p 1234
普通用户只能查自己进程,查系统服务必须加 sudolsof -p $PID 对普通用户仅显示其启动的进程;要查 nginx、mysql 等系统级进程,必须用 sudo。
过滤掉非实际读写的文件:排除 cwd、txt、mem
FD 列中 cwd(当前工作目录)、txt(可执行文件)、mem(内存映射)不算活跃 I/O 文件。聚焦真实读写操作,用:
sudo lsof -n -P -a -d ^cwd,^txt,^mem -p 1234
不知道 PID?用进程名反向定位:lsof -c name-c 匹配的是 ps 输出中的 COMMAND 字段(即二进制 basename),不是脚本名或完整路径:
-
sudo lsof -c python3→ 匹配/usr/bin/python3,不匹配main.py - 多个进程名用多个
-c:sudo lsof -c nginx -c php-fpm(逻辑 OR) - 注意大小写敏感,且含空格的 Java 进程名需先用
pgrep -f或ps aux | grep拿 PID
绕过 lsof:用 /proc/PID/fd/ 直接验证
当工具缺失、需确认符号链接目标或怀疑权限绕过时,这是最底层可信来源:
ls -l /proc/1234/fd/ # 列出所有 fd 符号链接 readlink /proc/1234/fd/7 # 查看 fd 7 指向的真实路径(含 `(deleted)` 提示)
注意:/proc/PID/fd/ 需已知 PID;而 lsof /path/to/file 是反向查——给路径就能找 PID,这才是不可替代的核心能力。











