如何查看指定进程打开的文件?
美国、香港服务器
如何查看指定进程打开的文件?
08-16 来源:
在 Linux 系统中,查看指定进程打开的文件最常用且高效的工具是 lsof 命令,此外也可通过 /proc 文件系统直接查看(更轻量,无需额外工具)。以下是两种方法的详细操作:
方法一:使用 lsof 命令(推荐,功能全面)
lsof(List Open Files)是专门用于列出进程打开文件的工具,支持按进程 ID(PID)或进程名筛选,输出信息丰富(如文件类型、权限、路径等)。
1. 按进程 ID(PID)查看(精准)
若已知进程的 PID(可通过 ps 或 top 命令获取),直接用 -p 参数指定 PID:
bash
# 查看 PID 为 1234 的进程打开的所有文件
lsof -p 1234
2. 按进程名查看(模糊 / 精确匹配)
若不知道 PID,但知道进程名(如 nginx、mysql),可用 -c 参数筛选:
bash
# 模糊匹配:查看所有以 "nginx" 开头的进程打开的文件(如 nginx、nginx-worker)
lsof -c nginx
# 精确匹配:只查看进程名完全为 "nginx" 的进程(需结合正则)
lsof -c ^nginx$
3. 查看指定进程打开的特定类型文件
可结合其他参数,筛选进程打开的某类文件(如网络连接、目录、设备等):
bash
# 查看 PID 1234 进程的所有网络连接(TCP/UDP)
lsof -p 1234 -i
# 查看 PID 1234 进程打开的所有目录
lsof -p 1234 -d ^cwd,^txt # -d 筛选文件描述符,^cwd(当前目录)、^txt(程序文件)需排除
输出结果解读
lsof -p 1234 的输出包含关键列,含义如下:
列名 说明
COMMAND 进程名称(如 nginx)
PID 进程 ID
USER 进程所属用户
FD 文件描述符(如 0u= 标准输入、1u= 标准输出、5r= 只读文件)
TYPE 文件类型(如 REG= 普通文件、DIR= 目录、IPv4= 网络连接、CHR= 字符设备)
NAME 文件路径(或网络连接的 IP: 端口、设备路径等)
方法二:通过 /proc 文件系统查看(轻量,无依赖)
Linux 系统的 /proc 目录下,每个进程对应一个以 PID 命名的子目录(如 /proc/1234),其中 fd 子目录存储了该进程打开的所有文件的符号链接,直接查看即可。
操作步骤:
进入指定进程的 fd 目录(需替换 1234 为实际 PID):
bash
cd /proc/1234/fd
列出所有打开的文件(ls -l 可查看链接指向的真实文件路径):
bash
ls -l
示例输出:
plaintext
lrwx------ 1 root root 64 8月 16 10:00 0 -> /dev/null
lrwx------ 1 root root 64 8月 16 10:00 1 -> /var/log/nginx/access.log
lrwx------ 1 root root 64 8月 16 10:00 2 -> /var/log/nginx/error.log
lr-x------ 1 root root 64 8月 16 10:00 3 -> /etc/nginx/nginx.conf
左侧的数字(如 0、1、2)是文件描述符;
箭头 -> 后是文件的真实路径(普通文件、设备、配置文件等)。
优势与局限:
优势:无需安装 lsof(系统默认存在 /proc),操作轻量;
局限:仅能查看文件路径,无法获取文件类型、占用用户等详细信息,且不支持按文件类型筛选。
常见场景示例
排查进程占用的日志文件:
bash
# 查看 PID 1234(nginx)打开的所有日志文件(筛选路径含 log 的文件)
lsof -p 1234 | grep log
确认进程是否打开了某个特定文件:
bash
# 查看 PID 1234 是否打开了 /etc/passwd
lsof -p 1234 | grep /etc/passwd
总结
场景 推荐方法 命令示例
需详细信息(类型 / 用户) lsof 按 PID / 进程名 lsof -p 1234 或 lsof -c nginx
仅需文件路径、无 lsof /proc/PID/fd 目录 ls -l /proc/1234/fd
两种方法可根据实际需求选择,日常排查问题优先用 lsof(信息更全面),仅需快速确认文件路径时可用 /proc 目录。
三二互联专业提供香港VPS,美国VPS主机,香港云服务器租用等业务香港美国到大陆CN2 GIA速度最快