..

/proc/pid文件夹解析

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

[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的进程的启动目录(工作空间),可以这样做

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

/proc/[pid]/environ

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

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

[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文件中的内存,如果它更加适阅读和理解。这个文件非常重要,大部分我需要关注的信息都能在这个文件里面找到。

[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: 程序实际占用内存大小