您的位置:

Linux Proc文件系统:了解Linux进程的内部机制

一、Proc文件系统简介

Proc 文件系统就是一个虚拟文件系统,它是内存文件系统,真正的不在磁盘上。

在 Linux 系统中,一切皆文件,包括硬件设备、网络协议等等,都被抽象成文件的形式,可以通过文件进行操作。而 proc 文件系统提供了一种接口,让我们可以通过文件的形式来访问 Linux 内核的信息,如进程信息、硬件信息、内核配置等。

它以文件和目录树的形式提供了与系统中其他进程进行交互和更新的一种方式。编写 proc 文件的时候,可以使用标准C库。即使在 Linux 系统之外,有些应用程序也使用 proc 文件接口。

二、Proc文件系统挂载

在 Linux 系统中,使用 mount 命令挂载 proc 文件系统。当我们运行 mount 命令的时候,我们可以看到 proc 文件系统已经被挂载到了 /procb 目录下。

~$ mount
...
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)

三、访问进程信息

我们可以通过进程的 PID 获取它的一些信息,如进程状态、运行时间、占用 CPU 的时间、线程信息等。

进程状态可以通过访问 /proc/[pid]/status 获取,如下所示:

~$ cat /proc/4897/status
Name:   nginx
Umask:  0022
[...]

进程的运行时间可以通过访问 /proc/[pid]/stat 获取:

~$ cat /proc/4897/stat
4897 (nginx) S 1 4897 4897 0 -1 4210688 107439 0 0 0 162 92 0 0 20 0 10 0 1730610 71272448 1808 18446744073709551615 94220644347712 94220644346916 140721911924288 0 0 0 0 4096 67174408 0 0 0 17 3 0 0 0 0 0

占用 CPU 的时间可以通过访问 /proc/[pid]/stat 获取:

~$ cat /proc/4897/stat
4897 (nginx) S 1 4897 4897 0 -1 4210688 107439 0 0 0 162 92 0 0 20 0 10 0 1730610 71272448 1808 18446744073709551615 94220644347712 94220644346916 140721911924288 0 0 0 0 4096 67174408 0 0 0 17 3 0 0 0 0 0

线程信息可以通过访问 /proc/[pid]/task/[tid]/stat 获取:

~$ cat /proc/4897/task/7832/stat
7832 (nginx) S 1 4897 4897 0 -1 4202752 107439 0 0 0 1 1 0 0 20 0 11 0 1748803 42796032 2016 18446744073709551615 93914891620352 93914809483144 140721911918856 140045395672112 0 0 0 0 4096 67174560 0 0 0 17 3 0 0 0 0 0

四、进程和文件系统如何关联起来

Proc 文件系统中的进程文件夹和其他文件夹操作上没什么区别,然而每个进程文件夹会指向 /proc/[PID] 目录下的一个文件 stub。在初始化进程时,内核为进程所注册的 proc_dir_entry 结构会连接到 /proc 文件系统的全局链表中。由于系统中所有进程都注册了 proc_dir_entry 结构,因此 proc 文件系统提供了一种管理、访问进程信息的统一接口。

五、Proc文件系统下常用的文件和目录

1. /proc/[pid]/cmdline

/proc/[pid]/cmdline 文件包含了启动进程时使用的命令行参数,以空格分隔的字符串表示,最后以 NULL 字节结束。通过修改该文件的内容可以改变进程的启动参数。

~$ cat /proc/4897/cmdline
nginx: master process nginx -g daemon on; master_process on;

2. /proc/[pid]/environ

/proc/[pid]/environ 文件记录了进程的环境变量名和其值。默认情况下,环境变量之间以 NULL 字节进行分隔。

~$ cat /proc/4897/environ
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
LANG=en_US.UTF-8
LANGUAGE=en_US:en
[...]

3. /proc/[pid]/status

/proc/[pid]/status 文件可以提供关于特定进程的信息,如其内存使用情况、排队信息、线程和文件描述符等。

~$ cat /proc/4897/status
Name:   nginx
Umask:  0022
Status: S (sleeping)
Pid:    4897
PPid:   1
Gid:    0   0   0   0
VmSize:   420168 kB
VmPeak:   485316 kB
VmExe:    /usr/sbin/nginx
VmLib:    /lib/x86_64-linux-gnu/libpthread-2.23.so
VmData:   29272 kB
VmStk:    136 kB
[...]

4. /proc/filesystems

这个文件显示当前正在使用的文件系统类型。/proc/filesystems 不显示未加载文件系统的类型。

~$ cat /proc/filesystems
nodev	sysfs
nodev	rootfs
nodev	ramfs
nodev	bdev
nodev	proc
nodev	cgroup
nodev	cgroup2
[...]

5. /proc/loadavg

这个文件包含了三个数值,即运行队列的平均长度(1分钟内),运行队列的平均长度(5分钟内)和运行队列的平均长度(15分钟内)。

~$ cat /proc/loadavg
0.27 0.20 0.24 1/770 26077

6. /proc/sys

/proc/sys 是一个目录,包含了一些系统运行时的变量,可以用于调整内核的行为。

例如,/proc/sys/net/ipv4/tcp_fin_timeout 文件表示 TCP 连接上发出最后一次数据包之后,连接仍打开的一段时间长度,按秒计算。如果 /proc/sys/net/ipv4/tcp_fin_timeout 中的值是 60,那么连接在关闭它们之后将等待 60 秒之后关闭。

7. /proc/cpuinfo

/proc/cpuinfo 文件包含关于 CPU 配置、速度和缓存大小等信息。

~$ cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 79
[...]

以上是一些常用的文件和目录,实际上 proc 文件系统提供了很多信息,限于篇幅和时间,无法一一播报。建议在使用过程中需要多多查询相关文档。