概述

Linux 系统上的 /proc 目录是一种文件系统,即 proc 文件系统(procfs),它以文件系统的方式为用户提供访问系统内核数据的操作接口。proc 文件系统是一种内核和内核模块用来向进程(process)发送信息的机制,因此被称为 proc。
与其它常见的文件系统不同的是,proc 是一种伪文件系统(也即虚拟文件系统),它只存在于内存当中,因此它会在系统启动时创建并挂载到 /proc 目录,在系统关闭时卸载并释放。
下面是某设备上 /proc 的挂载信息。

  1. $ mount | grep proc
  2. proc on /proc type proc (rw,relatime)

Proc 文件系统存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看系统和进程的信息,或者改变内核的运行状态,因此可以把它视为 Linux 内核开放给用户的控制和信息中心。实际上,proc 文件系统是内核空间和用户空间之间的一种通信媒介。
image.png

/proc 目录

进程目录

在 Linux 系统中,每一个运行的进程在 /proc 下都有一个以该进程 PID 命名的专属目录,包括内核进程。

  1. $ ls -l /proc/ | head
  2. total 0
  3. dr-xr-xr-x 9 root root 0 6 1 08:48 1
  4. dr-xr-xr-x 9 root root 0 6 3 13:52 10
  5. dr-xr-xr-x 9 www-data www-data 0 6 3 13:52 1000
  6. dr-xr-xr-x 9 www-data www-data 0 6 3 13:52 1001
  7. dr-xr-xr-x 9 rudy rudy 0 6 3 13:52 100743
  8. dr-xr-xr-x 9 root root 0 6 3 13:52 101
  9. dr-xr-xr-x 9 rudy rudy 0 6 3 13:52 101638
  10. dr-xr-xr-x 9 rudy rudy 0 6 3 13:52 101640
  11. dr-xr-xr-x 9 rudy rudy 0 6 3 13:52 101641

进程目录是读取进程信息的接口,其中包含许多文件和子目录。

  1. total 0
  2. -rw-r--r-- 1 mandeep mandeep 0 Apr 1 01:14 oom_score_adj
  3. dr-xr-xr-x 13 mandeep mandeep 0 Apr 1 01:14 task
  4. -r--r--r-- 1 mandeep mandeep 0 Apr 1 01:16 status
  5. -r--r--r-- 1 mandeep mandeep 0 Apr 1 01:16 stat
  6. -r--r--r-- 1 mandeep mandeep 0 Apr 1 01:16 cmdline
  7. -r--r--r-- 1 mandeep mandeep 0 Apr 1 01:17 wchan
  8. -rw-r--r-- 1 mandeep mandeep 0 Apr 1 01:17 uid_map
  9. -rw-rw-rw- 1 mandeep mandeep 0 Apr 1 01:17 timerslack_ns
  10. -r--r--r-- 1 mandeep mandeep 0 Apr 1 01:17 timers
  11. -r-------- 1 mandeep mandeep 0 Apr 1 01:17 syscall
  12. -r--r--r-- 1 mandeep mandeep 0 Apr 1 01:17 statm
  13. -r-------- 1 mandeep mandeep 0 Apr 1 01:17 stack
  14. -r--r--r-- 1 mandeep mandeep 0 Apr 1 01:17 smaps
  15. -rw-r--r-- 1 mandeep mandeep 0 Apr 1 01:17 setgroups
  16. -r--r--r-- 1 mandeep mandeep 0 Apr 1 01:17 sessionid
  17. -r--r--r-- 1 mandeep mandeep 0 Apr 1 01:17 schedstat
  18. -rw-r--r-- 1 mandeep mandeep 0 Apr 1 01:17 sched
  19. lrwxrwxrwx 1 mandeep mandeep 0 Apr 1 01:17 root -> /proc/2341/fdinfo
  20. -rw-r--r-- 1 mandeep mandeep 0 Apr 1 01:17 projid_map
  21. -r-------- 1 mandeep mandeep 0 Apr 1 01:17 personality
  22. ...

下表是 /proc/ 进程目录常用文件和子目录说明。

目录 描述
/proc/PID/cmdline 启动当前进程的完整命令,但僵尸进程目录中的此文件不包含任何信息。
/proc/PID/cwd 指向当前进程运行目录的一个符号链接。
/proc/PID/environ 进程环境变量列表。
/proc/PID/exe 指向启动当前进程的可执行文件(完整路径)的符号链接,可以通过它来启动当前进程的一个拷贝。
/proc/PID/fd 包含进程相关的所有的文件描述符。
/proc/PID/maps 与进程(可执行文件和库)相关的内存映射信息。
/proc/PID/mem 指代进程持有的内存,不可读。
/proc/PID/root 链接到进程的根目录。
/proc/PID/stat 进程状态信息。
/proc/PID/statm 进程使用的内存状态信息。
/proc/PID/status 进程状态信息,比 stat/statm 更具可读性。
/proc/self 链接到当前正在执行的进程。

除了通过 /proc/ 来获取指定进程的信息,Linux 还提供了一个有趣的 /proc/self 目录。这个目录的特别之处在于,不同的进程访问该目录时获得的信息是不同的,进程通过访问 /proc/self 目录可以获取该进程自己的信息,而不用每次都获取 PID,内容等价于 /proc/。在 fork、daemon 等 PID 可能发生变化的情形下很实用。

子文件

除了获取进程信息,我们通常还会用 /proc 来追踪进程的状态、内核的状态、内存信息、CPU 使用率、系统启动时间(可以使用系统正常运行时间)等相应的信息。
/proc 目录中的文件及其说明如下:

子目录

/proc 目录中的子目录及其说明如下:

子目录 描述
/proc/acpi 高级配置和电源接口。如果内核在引导系统时检测到 ACPI BIOS,将会自动激活 ACPI。
/proc/asound ALSA 声卡设备信息。
/proc/bus 系统总线(Bus)信息,例如 /proc/bus/input/、/proc/bus/pci 等。
/proc/device-tree 设备树信息。
/proc/driver 驱动信息。
/proc/dynamic_debug 控制动态打印调试。
/proc/fs 文件系统信息。
/proc/irq 中断请求设备信息。
/proc/net 网卡设备信息。例如 /proc/net/dev 显示网络适配器及统计信息。
/proc/pressure 系统资源的压力信息,包括 cpu、io 和 memory。
/proc/scsi scsi 设备信息(通过 SCSI 或 RAID 控制器连接的所有设备)。
/proc/sys 包括所有的内核参数信息,与 sysctl -a 相似
/proc/sysvipc 系统 ipc 信息,包括 msg、sem 和 shm。
/proc/tty tty 设备信息。

参考 Proc文件系统-https://getiot.tech/linux/linux-proc-filesystem.html