### Linux 怎么查看程序调用了哪些文件

1. 使用 `lsof` 命令

`lsof` (list open files) 是最强大和最常用的工具，它可以列出当前系统所有打开的文件，包括普通文件、目录、网络套接字等

基本用法：

要查看特定程序（通过 PID 或 进程名）打开了哪些文件，你可以使用以下命令：

- 按进程名查看：

      lsof -c <program_name>

  例如，要查看 `nginx` 进程打开了哪些文件，可以运行：

      lsof -c nginx

- 按进程 ID (PID) 查看：

      lsof -p <PID>

  首先，你需要找到程序的 PID。比如，使用 `ps aux | grep nginx` 或 `pgrep nginx`。然后，用找到的 PID 来查看：

      lsof -p 12345

常见输出字段：

`lsof` 的输出通常包含以下列：

- COMMAND：命令名
- PID：进程 ID
- USER：用户
- FD：文件描述符 (File Descriptor)
  - `cwd`：当前工作目录
  - `txt`：程序的可执行文件
  - `mem`：内存映射文件
  - `数字`：普通文件，后面通常跟着 `r` (读)、`w` (写) 或 `u` (读写)
- TYPE：文件类型（如 `REG` 表示普通文件，`DIR` 表示目录）
- NAME：文件名

2. 使用 `strace` 命令

`strace` 工具用于跟踪系统调用和信号。它可以记录程序在运行过程中对文件进行的各种操作，如 `open()`、`read()`、`write()` 等。

基本用法：

- 启动时跟踪新程序：

      strace <program_name>

  这个命令会启动程序，并实时打印出它所有的系统调用。要只看文件相关的调用，可以使用 `-e` 选项：

      strace -e trace=file <program_name>

  或者，更精确地跟踪 `open` 调用：

      strace -e open <program_name>

- 跟踪正在运行的程序：

      strace -p <PID>

  这会附加到指定的 PID 上，并开始跟踪其系统调用

`strace` 的输出非常详细，可以帮助你了解程序是如何与文件系统交互的，例如它尝试打开哪个文件、是否成功、返回的文件描述符是什么等等

3. 查看 `/proc` 文件系统

`/proc` 是一个虚拟文件系统，提供了对内核数据结构的访问。每个正在运行的进程都有一个对应的目录 `/proc/<PID>`

- `/proc/<PID>/fd/` 目录： 这个目录包含了进程打开的所有文件描述符的符号链接。你可以通过列出这个目录的内容来查看：

      ls -l /proc/<PID>/fd/

  这个命令会列出所有文件描述符及其指向的真实文件路径

- `/proc/<PID>/exe` 文件： 这是一个指向程序可执行文件的符号链接

      readlink /proc/<PID>/exe

- `/proc/<PID>/cwd` 文件： 这是一个指向程序当前工作目录的符号链接

      readlink /proc/<PID>/cwd

总结

- `lsof`：最直接、最常用的工具，可以快速查看一个程序当前打开了哪些文件。当你想知道“这个程序现在正在使用什么文件？”时，首选 `lsof`
- `strace`：用于 跟踪程序动态行为。当你想知道“这个程序在运行过程中尝试打开或访问了哪些文件？”或者想调试为什么某个文件无法打开时，`strace` 是最佳选择
- `/proc` 文件系统：这是一个 低级 的方法，提供了对进程状态的直接访问。当你无法使用 `lsof` 或 `strace` 时，或者需要编写脚本来获取信息时，`/proc` 是一个可靠的备选方案

通常情况下，`lsof -c <program_name>` 是解决大多数问题的起点，因为它简单、直接且输出清晰