/proc/pid文件夹解析

linux内核提供了用户访问内核数据的接口,就是/proc这个文件夹。这个文件夹中每一个数字组成的文件夹就是一个进程的信息,文件夹的数组是一个进程的pid,这篇文章是记录/pro/[pid]这个文件夹里面各个文件的调研结果,就是如何或程序在运行过程中的各项数据指标。/pro/[pid]这个文件夹里面一般有43个文件,每个文件或者文件夹都记录了不同的信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
[root@baochai /proc/1449]# ll
total 0
dr-xr-xr-x 2 root root 0 May 3 14:58 attr
-rw-r--r-- 1 root root 0 May 3 14:58 autogroup
-r-------- 1 root root 0 May 3 14:58 auxv
-r--r--r-- 1 root root 0 May 3 14:58 cgroup
--w------- 1 root root 0 May 3 14:58 clear_refs
-r--r--r-- 1 root root 0 May 3 11:40 cmdline
-rw-r--r-- 1 root root 0 May 3 14:58 comm #命令行程序的名字
-rw-r--r-- 1 root root 0 May 3 14:58 coredump_filter
-r--r--r-- 1 root root 0 May 3 14:58 cpuset
lrwxrwxrwx 1 root root 0 May 3 14:58 cwd -> /opt/gitlab/sv/gitaly # 当前进程的工作空间,可以理解为启动目录
-r-------- 1 root root 0 May 3 04:50 environ 这里文件里面存的是当前进程的环境变量
lrwxrwxrwx 1 root root 0 May 3 01:01 exe -> /opt/gitlab/embedded/bin/runsv # 当前进程可执行文件的绝对路径
dr-x------ 2 root root 0 May 3 04:51 fd
dr-x------ 2 root root 0 May 3 14:58 fdinfo
-r-------- 1 root root 0 May 3 14:58 io
-rw------- 1 root root 0 May 3 14:58 limits
-rw-r--r-- 1 root root 0 May 3 14:58 loginuid
-r--r--r-- 1 root root 0 May 3 14:58 maps
-rw------- 1 root root 0 May 3 14:58 mem
-r--r--r-- 1 root root 0 May 3 14:58 mountinfo
-r--r--r-- 1 root root 0 May 3 14:58 mounts # 当前进程能观察到的挂载信息
-r-------- 1 root root 0 May 3 14:58 mountstats
dr-xr-xr-x 4 root root 0 May 3 14:58 net
dr-x--x--x 2 root root 0 May 3 14:58 ns
-r--r--r-- 1 root root 0 May 3 14:58 numa_maps
-rw-r--r-- 1 root root 0 May 3 14:58 oom_adj
-r--r--r-- 1 root root 0 May 3 14:58 oom_score
-rw-r--r-- 1 root root 0 May 3 14:58 oom_score_adj
-r--r--r-- 1 root root 0 May 3 14:58 pagemap
-r--r--r-- 1 root root 0 May 3 14:58 personality
lrwxrwxrwx 1 root root 0 May 3 14:58 root -> /
-rw-r--r-- 1 root root 0 May 3 14:58 sched
-r--r--r-- 1 root root 0 May 3 14:58 schedstat
-r--r--r-- 1 root root 0 May 3 14:58 sessionid
-r--r--r-- 1 root root 0 May 3 14:58 smaps
-r--r--r-- 1 root root 0 May 3 14:58 stack
-r--r--r-- 1 root root 0 May 3 11:20 stat
-r--r--r-- 1 root root 0 May 3 10:44 statm
-r--r--r-- 1 root root 0 May 3 11:20 status
-r--r--r-- 1 root root 0 May 3 14:58 syscall
dr-xr-xr-x 3 root root 0 May 3 14:58 task
-r--r--r-- 1 root root 0 May 3 14:58 wchan
[root@baochai /proc/1449]#

/proc/[pid]/cmdline

一般情况下,这是一个只读的文件,只有当前该进程是僵尸进程的时候,你能够修改这个文件。读取这个文件返回的是当前进程的完成的命令行,如果当前进程是僵尸进程,那么读取这个文件会直接返回空字符串。

/proc/[pid]/cwd

这是一个link,指向当前进程的工作目录,也就是当前进程的启动目录,如果我需要看pid=20的进程的启动目录(工作空间),可以这样做

1
cd /proc/20/cwd && /bin/pwd

/proc/[pid]/environ

当前进程的环境变量的信息保存这个文件中

1
2
strings /proc/1/environ
// PATH=/opt/gitlab/bin:/opt/gitlab/embedded/bin:/usr/local/bin:/usr/local/sbin:/bin:/sbin:/usr/bin:/usr/sbin

这里的strings命令在对象文件或二进制文件中查找可打印的字符串。字符串是4个或更多可打印字符的任意序列,以换行符或空字符结束。

/proc/[pid]/exe

指向当前可执行文件的link,如果这个link对应的可执行文件被删除了,那么这个link中会包含一个delete字符串.

/proc/[pid]/fd/

这个文件夹中还包含了当前进程打开的所有的文件的文件描述符.并且是一个指向真实文件的link

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@baochai /proc/1449/fd]# ll
total 0
lrwx------ 1 root root 64 May 3 15:59 0 -> /dev/null
lrwx------ 1 root root 64 May 3 15:59 1 -> /dev/null
l-wx------ 1 root root 64 May 3 15:59 10 -> /opt/gitlab/sv/gitaly/supervise/control
lr-x------ 1 root root 64 May 3 15:59 11 -> /opt/gitlab/sv/gitaly/log/supervise/control
l-wx------ 1 root root 64 May 3 15:59 12 -> /opt/gitlab/sv/gitaly/log/supervise/control
lr-x------ 1 root root 64 May 3 15:59 13 -> /opt/gitlab/sv/gitaly/supervise/ok
lr-x------ 1 root root 64 May 3 15:59 14 -> /opt/gitlab/sv/gitaly/log/supervise/ok
l-wx------ 1 root root 64 May 3 15:59 2 -> pipe:[11917]
lr-x------ 1 root root 64 May 3 15:59 3 -> pipe:[11931]
l-wx------ 1 root root 64 May 3 15:59 4 -> pipe:[11931]
lr-x------ 1 root root 64 May 3 15:59 5 -> pipe:[11945]
l-wx------ 1 root root 64 May 3 15:59 6 -> pipe:[11945]
l-wx------ 1 root root 64 May 3 15:59 7 -> /opt/gitlab/sv/gitaly/supervise/lock
l-wx------ 1 root root 64 May 3 15:59 8 -> /opt/gitlab/sv/gitaly/log/supervise/lock
lr-x------ 1 root root 64 May 3 15:59 9 -> /opt/gitlab/sv/gitaly/supervise/control
[root@baochai /proc/1449/fd]#

0表示的是标准输入,1表示标准输出,2表示标准所诶输出

/proc/[pid]/io

这个文件保存了当前进程的io状态。

/proc/[pid]/mountinfo

这个文件保存了当前进程namespace空间下的挂载信息。

/proc/[pid]/statm

这个文件保存了当前进程的内存使用信息。

/proc/[pid]/status

这个文件保存了当前进程的状态信息,包括/proc/[pid]/stat 和/proc/[pid]/statm文件中的内存,如果它更加适阅读和理解。这个文件非常重要,大部分我需要关注的信息都能在这个文件里面找到。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
[root@baochai /proc/1449]# cat status
Name: runsv
State: S (sleeping)
Tgid: 1449
Pid: 1449
PPid: 1423
TracerPid: 0
Uid: 0 0 0 0
Gid: 0 0 0 0
Utrace: 0
FDSize: 64
Groups:
VmPeak: 3996 kB
VmSize: 3940 kB
VmLck: 0 kB
VmHWM: 380 kB
VmRSS: 380 kB
VmData: 40 kB
VmStk: 88 kB
VmExe: 24 kB
VmLib: 1704 kB
VmPTE: 32 kB
VmSwap: 0 kB
Threads: 1
SigQ: 0/62793
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000000
SigCgt: 0000000000014000
CapInh: 0000000000000000
CapPrm: ffffffffffffffff
CapEff: ffffffffffffffff
CapBnd: ffffffffffffffff
Cpus_allowed: ffffffff
Cpus_allowed_list: 0-31
Mems_allowed: 00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000003
Mems_allowed_list: 0-1
voluntary_ctxt_switches: 439
nonvoluntary_ctxt_switches: 2
[root@baochai /proc/1449]#

  • Name: 进程启动的名字
  • State: 当前进程的状态, “R (running)”,
    "S (sleeping)", "D (disk sleep)", "T (stopped)", "T (tracing
    stop)", "Z (zombie)", or "X (dead)".
    
  • Pid: 当前进程的pid
  • PPid: 父进程的pid
  • VmPeak: 最大虚拟内存大小
  • VmSize: 虚拟内存大小
  • VmLck: 被锁定的内存大小
  • VmPin:固定内存大小
  • VmRSS: 程序实际占用内存大小