首页 > linux/unix > Linux /proc目录详解之进程目录
2017
08-06

Linux /proc目录详解之进程目录

proc目录中包含许多以数字命名的子目录,这些数字表示系统当前正在运行进程的进程号,里面包含对应进程相关的多个信息文件。 
 

[root@rhel5 ~]# ll /proc
total 0
dr-xr-xr-x.  9 root           root                         0 Aug 10 09:27 1
dr-xr-xr-x.  9 root           root                         0 Aug 10 09:27 10
dr-xr-xr-x.  9 root           root                         0 Aug 10 10:00 10413
dr-xr-xr-x.  9 root           root                         0 Aug 10 10:00 10444
dr-xr-xr-x.  9 root           root                         0 Aug 10 10:00 10449
dr-xr-xr-x.  9 root           root                         0 Aug 10 09:29 1050
dr-xr-xr-x.  9 root           root                         0 Aug 10 09:27 11
dr-xr-xr-x.  9 root           root                         0 Aug 10 10:21 11079
dr-xr-xr-x.  9 root           root                         0 Aug 10 10:26 11185
dr-xr-xr-x.  9 root           root                         0 Aug 10 09:27 114
dr-xr-xr-x.  9 root           root                         0 Aug 10 10:36 11422
dr-xr-xr-x.  9 root           root                         0 Aug 10 10:44 11651
dr-xr-xr-x.  9 root           root                         0 Aug 10 10:59 11991
dr-xr-xr-x.  9 root           root                         0 Aug 10 09:27 12
dr-xr-xr-x.  9 root           root                         0 Aug 10 09:28 1202
dr-xr-xr-x.  9 root           root                         0 Aug 10 09:28 1204
dr-xr-xr-x.  9 root           root                         0 Aug 10 09:28 1206
dr-xr-xr-x.  9 root           root                         0 Aug 10 11:04 12125
dr-xr-xr-x.  9 root           root                         0 Aug 10 11:04 12127
dr-xr-xr-x.  9 root           root                         0 Aug 10 11:06 12168


上面列出的是/proc目录中一些进程相关的目录,每个目录中是当程本身相关信息的文件。下面是作者系统(RHEL5.3)上运行的一个PID为2674的进程saslauthd的相关文件,其中有些文件是每个进程都会具有的,后文会对这些常见文件做出说明。 

[root@rhel5 ~]# ll /proc/667
total 0
dr-xr-xr-x. 2 root root 0 Aug 10 11:11 attr
-rw-r–r–. 1 root root 0 Aug 10 11:11 autogroup
-r——–. 1 root root 0 Aug 10 11:11 auxv
-r–r–r–. 1 root root 0 Aug 10 11:11 cgroup
–w——-. 1 root root 0 Aug 10 11:11 clear_refs
-r–r–r–. 1 root root 0 Aug 10 09:28 cmdline
-rw-r–r–. 1 root root 0 Aug 10 11:11 comm
-rw-r–r–. 1 root root 0 Aug 10 11:11 coredump_filter
-r–r–r–. 1 root root 0 Aug 10 11:11 cpuset
lrwxrwxrwx. 1 root root 0 Aug 10 11:11 cwd -> /
-r——–. 1 root root 0 Aug 10 11:11 environ
lrwxrwxrwx. 1 root root 0 Aug 10 11:11 exe -> /usr/bin/bash
dr-x——. 2 root root 0 Aug 10 11:11 fd
dr-x——. 2 root root 0 Aug 10 11:11 fdinfo
-rw-r–r–. 1 root root 0 Aug 10 11:11 gid_map
-r——–. 1 root root 0 Aug 10 11:11 io
-r–r–r–. 1 root root 0 Aug 10 11:11 limits
-rw-r–r–. 1 root root 0 Aug 10 11:11 loginuid
dr-x——. 2 root root 0 Aug 10 11:11 map_files
-r–r–r–. 1 root root 0 Aug 10 11:11 maps
-rw——-. 1 root root 0 Aug 10 11:11 mem
-r–r–r–. 1 root root 0 Aug 10 11:11 mountinfo
-r–r–r–. 1 root root 0 Aug 10 11:11 mounts
-r——–. 1 root root 0 Aug 10 11:11 mountstats
dr-xr-xr-x. 6 root root 0 Aug 10 11:11 net
dr-x–x–x. 2 root root 0 Aug 10 11:11 ns
-r–r–r–. 1 root root 0 Aug 10 11:11 numa_maps
-rw-r–r–. 1 root root 0 Aug 10 11:11 oom_adj
-r–r–r–. 1 root root 0 Aug 10 11:11 oom_score
-rw-r–r–. 1 root root 0 Aug 10 11:11 oom_score_adj
-r–r–r–. 1 root root 0 Aug 10 11:11 pagemap
-r–r–r–. 1 root root 0 Aug 10 11:11 personality
-rw-r–r–. 1 root root 0 Aug 10 11:11 projid_map
lrwxrwxrwx. 1 root root 0 Aug 10 11:11 root -> /
-rw-r–r–. 1 root root 0 Aug 10 11:11 sched
-r–r–r–. 1 root root 0 Aug 10 11:11 schedstat
-r–r–r–. 1 root root 0 Aug 10 11:11 sessionid
-rw-r–r–. 1 root root 0 Aug 10 11:11 setgroups
-r–r–r–. 1 root root 0 Aug 10 11:11 smaps
-r–r–r–. 1 root root 0 Aug 10 11:11 stack
-r–r–r–. 1 root root 0 Aug 10 09:28 stat
-r–r–r–. 1 root root 0 Aug 10 11:11 statm
-r–r–r–. 1 root root 0 Aug 10 09:28 status
-r–r–r–. 1 root root 0 Aug 10 11:11 syscall
dr-xr-xr-x. 3 root root 0 Aug 10 11:11 task
-r–r–r–. 1 root root 0 Aug 10 11:11 timers
-rw-r–r–. 1 root root 0 Aug 10 11:11 uid_map
-r–r–r–. 1 root root 0 Aug 10 11:11 wchan


1、cmdline — 启动当前进程的完整命令,里面包括了运行时指定的一些参数,但僵尸进程目录中的此文件不包含任何信息; 

[root@rhel5 ~]# more /proc/667/cmdline 
/bin/bash/usr/sbin/ksmtuned

2、cwd — current working directory,指向当前进程运行目录的一个符号链接; 

3、environ — 当前进程的环境变量列表,彼此间用空字符(NULL)隔开;变量用大写字母表示,其值用小写字母表示; 

[root@rhel5 ~]# more /proc/667/environ 
LANG=en_US.UTF-8PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin


4、exe — 指向启动当前进程的可执行文件(完整路径)的符号链接,通过/proc/N/exe可以启动当前进程的一个拷贝; 

5、fd — 这是个目录,包含当前进程打开的每一个文件的文件描述符(file descriptor),这些文件描述符是指向实际文件的一个符号链接; 

[root@rhel5 ~]# ll /proc/667/fd
total 0
lr-x——. 1 root root 64 Aug 10 11:26 0 -> /dev/null
lrwx——. 1 root root 64 Aug 10 11:26 1 -> socket:[17927]
lrwx——. 1 root root 64 Aug 10 11:26 2 -> socket:[17927]


6、limits — 当前进程所使用的每一个受限资源的软限制、硬限制和管理单元;此文件仅可由实际启动当前进程的UID用户读取;(2.6.24以后的内核版本支持此功能); 

7、maps — 当前进程关联到的每个可执行文件和库文件在内存中的映射区域及其访问权限所组成的列表; 

[root@rhel5 ~]# cat /proc/667/maps 
00400000-004dd000 r-xp 00000000 08:03 50408238                           /usr/bin/bash
006dc000-006dd000 r–p 000dc000 08:03 50408238                           /usr/bin/bash
006dd000-006e6000 rw-p 000dd000 08:03 50408238                           /usr/bin/bash
006e6000-006ec000 rw-p 00000000 00:00 0 
00741000-00762000 rw-p 00000000 00:00 0                                  [heap]
7f5dd6e37000-7f5dd6e43000 r-xp 00000000 08:03 90050                      /usr/lib64/libnss_files-2.17.so
7f5dd6e43000-7f5dd7042000 —p 0000c000 08:03 90050                      /usr/lib64/libnss_files-2.17.so
7f5dd7042000-7f5dd7043000 r–p 0000b000 08:03 90050                      /usr/lib64/libnss_files-2.17.so
7f5dd7043000-7f5dd7044000 rw-p 0000c000 08:03 90050                      /usr/lib64/libnss_files-2.17.so


8、mem — 当前进程所占用的内存空间,由open、read和lseek等系统调用使用,不能被用户读取; 

9、root — 指向当前进程运行根目录的符号链接;在Unix和Linux系统上,通常采用chroot命令使每个进程运行于独立的根目录; 

10、stat — 当前进程的状态信息,包含一系统格式化后的数据列,可读性差,通常由ps命令使用; 

11、statm — 当前进程占用内存的状态信息,通常以“页面”(page)表示; 

12、status — 与stat所提供信息类似,但可读性较好,可以通过使用工具如"ps"和"top",如下所示,每行表示一个属性信息;其详细介绍请参见 proc的man手册页; 

[root@rhel5 ~]# more /proc/667/status 
Name:   ksmtuned                  #进程名
State:  S (sleeping)             #进程的状态我们前文已经做了很详细的分析,各进程的状态代表的意义如下:
                                  #R (running)", "S (sleeping)", "D (disk sleep)", "T (stopped)", "T(tracing stop)", "Z (zombie)", or "X (dead)"
Tgid:   667                      #Tgid是线程组的ID,一个线程一定属于一个线程组(进程组).
Ngid:   0
Pid:    667                        #这个是进程的ID,更准确的说应该是线程的ID.
PPid:   1                          #当前进程的父进程
TracerPid:      0                        跟踪当前进程的进程ID,如果是0,表示没有跟踪.
Uid:    0       0       0       0
Gid:    0       0       0       0      #第一列数字(RUID):实际用户ID,指的是进程执行者是谁.
                                       #第二列数字(EUID):有效用户ID,指进程执行时对文件的访问权限.
                                       #第三列数字(SUID):保存设置用户ID,作为effective user ID的副本,在执行exec调用时后能重新恢复原来的effectiv user ID.
                                       #第四列数字(FSUID):目前进程的文件系统的用户识别码.一般情况下,文件系统的用户识别码(fsuid)与有效的用户识别码(euid)是相同的.
FDSize: 256                           #当前分配的文件描述符,这个值不是当前进程使用文件描述符的上限.
Groups:                               #表示启动这个进程的用户所在的组.
VmPeak:   115248 kB                   #代表当前进程运行过程中占用内存的峰值.
VmSize:   115248 kB                   #进程现在正在占用的内存
VmLck:         0 kB                   #进程已经锁住的物理内存的大小.锁住的物理内存不能交换到硬盘.
VmPin:         0 kB                   
VmHWM:       944 kB                   #序得到分配到物理内存的峰值.
VmRSS:       944 kB                   #程序现在使用的物理内存.
RssAnon:             252 kB
RssFile:             692 kB
RssShmem:             ?0 kB
VmData:      232 kB                   #表示进程数据段的大小.
VmStk:       136 kB                   #进程堆栈段的大小.
VmExe:       884 kB                   #进程代码的大小.
VmLib:      2088 kB                   #进程所使用LIB库的大小.
VmPTE:        40 kB                   #占用的页表的大小.
VmSwap:        0 kB                   #进程占用Swap的大小.
Threads:        1                     #表示当前进程组有3个线程.
SigQ:   0/3792                        #表示当前待处理信号的个数
SigPnd: 0000000000000000              #屏蔽位,存储了该线程的待处理信号,等同于线程的PENDING信号.
ShdPnd: 0000000000000000              #屏蔽位,存储了该线程组的待处理信号.等同于进程组的PENDING信号.
SigBlk: 0000000000010000              #存放被阻塞的信号,等同于BLOCKED信号.
SigIgn: 0000000000001006              #存放被忽略的信号,等同于IGNORED信号.
SigCgt: 0000000000010200              #存放捕获的信号,等同于CAUGHT信号.
CapInh: 0000000000000000              #表示能够被当前进程执行的程序继承的能力.
CapPrm: 0000001fffffffff              #表示进程能够使用的能力,在cap_permitted中可以包含cap_effective中没有的能力,这些能力是被进程自己临时放弃的,也可以说cap_effective是cap_permitted的一个子集.
CapEff: 0000001fffffffff              #当一个进程要进行某个特权操作时,操作系统会检查cap_effective的对应位是否有效,而不再是检查进程的有效UID是否为0.
CapBnd: 0000001fffffffff              #是系统的边界能力,我们无法改变它.
CapAmb: 0000000000000000
Seccomp:        0
Cpus_allowed:   ffffffff,ffffffff,ffffffff,ffffffff
Cpus_allowed_list:      0-127
Mems_allowed:   00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,

00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,

00000000,00000000,00000000,00000000,00000000,00000001
Mems_allowed_list:      0               #
voluntary_ctxt_switches:        595     #表示进程主动切换的次数.
nonvoluntary_ctxt_switches:     0       #表示进程被动切换的次数.


13、task — 目录文件,包含由当前进程所运行的每一个线程的相关信息,每个线程的相关信息文件均保存在一个由线程号(tid)命名的目录中,这类似于其内容类似于每个进程目录中的内容;(内核2.6版本以后支持此功能) 

14、oom_adj/oom_score:这两个与linux的OOM机制有关的文件(关于OOM请看这里),oom_adj相当于一个因子,它值越大,在OOM时更容易被系统kill掉,但最终决定是否被kill的是oom_score,其实计算这个oom_score时,就是根据oom_adj来的,oom_adj更大,计算出来的oom_score就更大,也能容易在OOM时被系统kill掉。当然如果是很重要的服务现场,为了避免出现这种情况设置oom_adj=0就行,表示永远不会因为OOM被kill。

 

  参考:http://man7.org/linux/man-pages/man5/proc.5.html

            http://blog.csdn.net/beckdon/article/details/48491909

最后编辑:
作者:liujg
真实-不弄虚,不做假,做自己,不违心; 踏实-不浮躁,不盲从,不急功,不近利; 实学-不投机,不取巧,勤于学,精于业。