114 lines
3.8 KiB
Markdown
114 lines
3.8 KiB
Markdown
### Linux 怎么查看程序调用了哪些文件
|
|
|
|
**1. 使用 `lsof` 命令**
|
|
|
|
`lsof` (list open files) 是最强大和最常用的工具,它可以列出当前系统所有打开的文件,包括普通文件、目录、网络套接字等
|
|
|
|
**基本用法:**
|
|
|
|
要查看特定程序(通过 **PID** 或 **进程名**)打开了哪些文件,你可以使用以下命令:
|
|
|
|
- **按进程名查看:**
|
|
|
|
```bash
|
|
lsof -c <program_name>
|
|
```
|
|
|
|
例如,要查看 `nginx` 进程打开了哪些文件,可以运行:
|
|
|
|
```bash
|
|
lsof -c nginx
|
|
```
|
|
|
|
- **按进程 ID (PID) 查看:**
|
|
|
|
```bash
|
|
lsof -p <PID>
|
|
```
|
|
|
|
首先,你需要找到程序的 PID。比如,使用 `ps aux | grep nginx` 或 `pgrep nginx`。然后,用找到的 PID 来查看:
|
|
|
|
```bash
|
|
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()` 等。
|
|
|
|
**基本用法:**
|
|
|
|
- **启动时跟踪新程序:**
|
|
|
|
```bash
|
|
strace <program_name>
|
|
```
|
|
|
|
这个命令会启动程序,并实时打印出它所有的系统调用。要只看文件相关的调用,可以使用 `-e` 选项:
|
|
|
|
```bash
|
|
strace -e trace=file <program_name>
|
|
```
|
|
|
|
或者,更精确地跟踪 `open` 调用:
|
|
|
|
```bash
|
|
strace -e open <program_name>
|
|
```
|
|
|
|
- **跟踪正在运行的程序:**
|
|
|
|
```bash
|
|
strace -p <PID>
|
|
```
|
|
|
|
这会附加到指定的 PID 上,并开始跟踪其系统调用
|
|
|
|
`strace` 的输出非常详细,可以帮助你了解程序是如何与文件系统交互的,例如它尝试打开哪个文件、是否成功、返回的文件描述符是什么等等
|
|
|
|
**3. 查看 `/proc` 文件系统**
|
|
|
|
`/proc` 是一个虚拟文件系统,提供了对内核数据结构的访问。每个正在运行的进程都有一个对应的目录 `/proc/<PID>`
|
|
|
|
- **`/proc/<PID>/fd/` 目录:** 这个目录包含了进程打开的所有文件描述符的符号链接。你可以通过列出这个目录的内容来查看:
|
|
|
|
```bash
|
|
ls -l /proc/<PID>/fd/
|
|
```
|
|
|
|
这个命令会列出所有文件描述符及其指向的真实文件路径
|
|
|
|
- **`/proc/<PID>/exe` 文件:** 这是一个指向程序可执行文件的符号链接
|
|
|
|
```bash
|
|
readlink /proc/<PID>/exe
|
|
```
|
|
|
|
- **`/proc/<PID>/cwd` 文件:** 这是一个指向程序当前工作目录的符号链接
|
|
|
|
```bash
|
|
readlink /proc/<PID>/cwd
|
|
```
|
|
|
|
**总结**
|
|
|
|
- **`lsof`**:最直接、最常用的工具,**可以快速查看**一个程序当前打开了哪些文件。当你想知道“这个程序现在正在使用什么文件?”时,首选 `lsof`
|
|
- **`strace`**:用于 **跟踪程序动态行为**。当你想知道“这个程序在运行过程中**尝试**打开或访问了哪些文件?”或者想调试为什么某个文件无法打开时,`strace` 是最佳选择
|
|
- **`/proc` 文件系统**:这是一个 **低级** 的方法,提供了对进程状态的直接访问。当你无法使用 `lsof` 或 `strace` 时,或者需要编写脚本来获取信息时,`/proc` 是一个可靠的备选方案
|
|
|
|
通常情况下,**`lsof -c <program_name>`** 是解决大多数问题的起点,因为它简单、直接且输出清晰 |