版权声明:本文为EnweiTech原创文章,未经博主允许不得转载。 https://blog.****.net/English0523/article/details/53391567
Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。
用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的。下面列出的这些文件或子文件夹,并不是都是在你的系统中存在,这取决于你的内核配置和装载的模块。另外,在/proc下还有三个很重要的目录:net,scsi和sys。 Sys目录是可写的,可以通过它来访问或修改内核的参数,而net和scsi则依赖于内核配置。例如,如果系统不支持scsi,则scsi 目录不存在。
除了以上介绍的这些,还有的是一些以数字命名的目录,它们是进程目录。系统中当前运行的每一个进程都有对应的一个目录在/proc下,以进程的 PID号为目录名,它们是读取进程信息的接口。而self目录则是读取进程本身的信息接口,是一个link。
)
下面对整个 /proc 目录作一个大略的介绍.
[number]
在 /proc 目录里, 每个正在运行的进程都有一个以该进程 ID 命名的子目录, 其下包括如下的目录和伪文件:
该文件保存了进程的完整命令行. 如果该进程已经被交换出内存, 或者该进程已经僵死, 那么就没有任何东西在该文件里, 这时候对该文件的读操作将返回零个字符. 该文件以空字符 null 而不是换行符作为结束标志.
[number] /cwd
一个符号连接, 指向进程当前的工作目录. 例如, 要找出进程 20 的 cwd, 你可以:
cd /proc/20/cwd; /bin/pwd
请注意 pwd 命令通常是 shell 内置的, 在这样的情况下可能工作得不是很好(casper 注: pwd 只能显示 /proc/20/cwd, 要是想知道它的工作目录,直接ls -al /proc/20不就好了).
[number] /environ
该文件保存进程的环境变量, 各项之间以空字符分隔, 结尾也可能是一个空字符. 因此, 如果要输出进程 1 的环境变量, 你应该:
(cat /proc/1/environ; echo) | tr ";\000"; ";\n";
(至于为什么想要这么做, 请参阅 lilo(8).)
[number] /exe
也是一个符号连接, 指向被执行的二进制代码. 在 Linux 2.0 或者更早的版本下, 对 exe 特殊文件的 readlink(2) 返回一个如下格式的字符串: [设备号]:节点号
[number] /fd
进 程所打开的每个文件都有一个符号连接在该子目录里, 以文件描述符命名, 这个名字实际上是指向真正的文件的符号连接,(和 exe 记录一样).例如, 0 是标准输入, 1 是标准输出, 2 是标准错误, 等等. 程序有时可能想要读取一个文件却不想要标准输入,或者想写到一个文件却不想将输出送到标准输出去,那么就可以很有效地用如下的办法骗过(假定 -i 是输入文件的标志, 而 -o 是输出文件的标志):
foobar -i /proc/self/fd/0 -o /proc/self/fd/1 ...
这 样就是一个能运转的过滤器. 请注意该方法不能用来在文件里搜索, 这是因为 fd 目录里的文件是不可搜索的. 在 UNIX 类的系统下, /proc/self/fd/N 基本上就与 /dev/fd/N 相同. 实际上, 大多数的 Linux MAKEDEV 脚本都将 /dev/fd 符号连接到 [..]/proc/self/fd 上.
attr:
进程的属性
cmdline:
启动进程时执行的命令
cwd:
指向进程当前工作目录的软链
ll cwd可知是个软连接。
environ:
进程执行时使用的环境变量,文件内容使用null字节('\0')分隔,然后以null字节结束。因此获取进程使用的环境变量使用如下:
(cat /proc/pid/environ; echo) | tr '\000' '\n'
fd:
此目录包含进程打开的所有文件,文件名为文件描述符,目录中每个软连接都会指向进程打开的实际文件。
比如:nginx下:
[email protected]:/proc/22210/fd# ll
total 0
dr-x------ 2 root root 0 Oct 20 17:39 ./
dr-xr-xr-x 9 root root 0 Oct 20 17:22 ../
lrwx------ 1 root root 64 Oct 20 17:39 0 -> /dev/null
lrwx------ 1 root root 64 Oct 20 17:39 1 -> /dev/null
lrwx------ 1 root root 64 Oct 20 17:39 10 -> socket:[2917559817]
l-wx------ 1 root root 64 Oct 20 17:39 2 -> /opt/nginx/logs/error.log
l-wx------ 1 root root 64 Oct 20 17:39 3 -> /opt/nginx/logs/access.log
lrwx------ 1 root root 64 Oct 20 17:39 6 -> socket:[2917557592]
lrwx------ 1 root root 64 Oct 20 17:39 7 -> socket:[2917557593]
l-wx------ 1 root root 64 Oct 20 17:39 8 -> /opt/nginx/logs/error.log
lrwx------ 1 root root 64 Oct 20 17:39 9 -> socket:[2917559816]
limits:
该文件存储了进程的软限制,硬限制等信息。
可以查看该进程允许打开的最大描述字个数。
maps:
address perms offset dev inode pathname
08048000-08056000 r-xp 00000000 03:0c 64593 /usr/sbin/gpm
4001f000-40135000 r-xp 00000000 03:0c 45494 /lib/libc-2.2.4.so
* address:进程占用的地址空间。
* perms:权限集
r = read
w = write
x = execute
s = shared
p = private (copy on write)
* offset:文件偏移量。
* dev:为设备(major:minor)
* inode:设备上的inode。0为没有inode关联互内存区域,通常为:BSS(uninitialized data)
root:
指向进程更目录的软链
smaps:
This file shows memory consumption for each of the process's mappings. For each of mappings there is a series of lines such as the following:
08048000-080bc000 r-xp 00000000 03:02 13130 /bin/bash
Size: 464 kB
Rss: 424 kB
Shared_Clean: 424 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 0 kB
The first of these lines shows the same information as is displayed for the mapping in /proc/[pid]/maps. The remaining lines show the size of
the mapping, the amount of the mapping that is currently resident in RAM, the number of clean and dirty shared pages in the mapping, and the
number of clean and dirty private pages in the mapping.
This file is only present if the CONFIG_MMU kernel configuration option is enabled.
一、/proc/pid/statm
pid/statm包含了在此进程中所有CPU活跃的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。
/proc/1 # cat statm
550 70 62 451 0 97 0
输出解释
CPU 以及CPU0。。。的每行的每个参数意思(以第一行为例)为:
参数 解释 /proc/1/status
Size (pages)= 550 任务虚拟地址空间的大小 VmSize/4
Resident(pages)= 70 应用程序正在使用的物理内存的大小 VmRSS/4
Shared(pages)= 62 共享页数
Trs(pages)= 451 程序所拥有的可执行虚拟内存的大小 VmExe/4
Lrs(pages)= 0 被映像到任务的虚拟内存空间的库的大小 VmLib/4
Drs(pages)= 97 程序数据段和用户态的栈的大小 (VmData+ VmStk )4
dt(pages) 0
二、/proc/pid/stat
pid/stat包含了进程所有CPU活跃的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。
/proc/1 # cat stat
1 (linuxrc) S 0 0 0 0 -1 8388864 50 633 20 4 2 357 72 342 16 0 1 0 22 2252800 70 4294967295 32768 1879936 3199270704 3199269552 1113432 0 0 0 674311 3221479524 0 0 0 0 0 0
每个参数意思为:
参数 解释
pid=1 进程(包括轻量级进程,即线程)号
comm= linuxrc 应用程序或命令的名字
task_state=S 任务的状态,R:runnign, S:sleeping (TASK_INTERRUPTIBLE), D:disk sleep (TASK_UNINTERRUPTIBLE), T: stopped, T:tracing stop,Z:zombie, X:dead
ppid=0 父进程ID
pgid=0 线程组号
sid=0 c该任务所在的会话组ID
tty_nr=0(pts/3) 该任务的tty终端的设备号,INT(0/256)=主设备号,(0-主设备号)=次设备号
tty_pgrp=-1 终端的进程组号,当前运行在该任务所在终端的前台任务(包括shell 应用程序)的PID。
task->flags=8388864进程标志位,查看该任务的特性
min_flt=50该任务不需要从硬盘拷数据而发生的缺页(次缺页)的次数
cmin_flt=633 累计的该任务的所有的waited-for进程曾经发生的次缺页的次数目
maj_flt=20该任务需要从硬盘拷数据而发生的缺页(主缺页)的次数
cmaj_flt=4 累计的该任务的所有的waited-for进程曾经发生的主缺页的次数目
utime=2 该任务在用户态运行的时间,单位为jiffies
stime=357 该任务在核心态运行的时间,单位为jiffies
cutime=72 累计的该任务的所有的waited-for进程曾经在用户态运行的时间,单位为jiffies
cstime=342 累计的该任务的所有的waited-for进程曾经在核心态运行的时间,单位为jiffies
priority=16 任务的动态优先级
nice=0 任务的静态优先级
num_threads=1 该任务所在的线程组里线程的个数
it_real_value=0 由于计时间隔导致的下一个 SIGALRM 发送进程的时延,以 jiffy 为单位.
start_time=22 该任务启动的时间,单位为jiffies
vsize=2252800(bytes) 该任务的虚拟地址空间大小
rss=70(page) 该任务当前驻留物理地址空间的大小
Number of pages the process has in real memory,minu 3 for administrative purpose.
这些页可能用于代码,数据和栈。
rlim=4294967295=0xFFFFFFFF(bytes) 该任务能驻留物理地址空间的最大值
start_code=32768=0x8000 该任务在虚拟地址空间的代码段的起始地址(由连接器决定)
end_code=1879936该任务在虚拟地址空间的代码段的结束地址
start_stack=3199270704=0Xbeb0ff30该任务在虚拟地址空间的栈的开始地址
kstkesp=3199269552 sp(32 位堆栈指针) 的当前值, 与在进程的内核堆栈页得到的一致.
kstkeip=1113432 =0X10FD58 指向将要执行的指令的指针, PC(32 位指令指针)的当前值.
pendingsig=0 待处理信号的位图,记录发送给进程的普通信号
block_sig=0 阻塞信号的位图
sigign=0 忽略的信号的位图
sigcatch=674311被俘获的信号的位图
wchan=3221479524 如果该进程是睡眠状态,该值给出调度的调用点
nswap=0 被swapped的页数
cnswap=0 所有子进程被swapped的页数的和
exit_signal=0 该进程结束时,向父进程所发送的信号
task_cpu(task)=0 运行在哪个CPU上
task_rt_priority=0 实时进程的相对优先级别
task_policy=0 进程的调度策略,0=非实时进程,1=FIFO实时进程;2=RR实时进程
三、/proc/pid/status
包含了所有CPU活跃的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。
/proc/286 # cat status
Name: mmtest
State: R (running)
SleepAVG: 0%
Tgid: 286
Pid: 286
PPid: 243
TracerPid: 0
Uid: 0 0 0 0
Gid: 0 0 0 0
FDSize: 32
Groups:
VmPeak: 1464 kB
VmSize: 1464 kB
VmLck: 0 kB
VmHWM: 344 kB
VmRSS: 344 kB
VmData: 20 kB
VmStk: 84 kB
VmExe: 4 kB
VmLib: 1300 kB
VmPTE: 6 kB
Threads: 1
SigQ: 0/256
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000000
SigCgt: 0000000000000000
CapInh: 0000000000000000
CapPrm: 00000000fffffeff
CapEff: 00000000fffffeff
输出解释
参数 解释
Name 应用程序或命令的名字
State 任务的状态,运行/睡眠/僵死/
SleepAVG 任务的平均等待时间(以nanosecond为单位),交互式任务因为休眠次数多、时间长,它们的 sleep_avg 也会相应地更大一些,所以计算出来的优先级也会相应高一些。
Tgid=286 线程组号
Pid=286 任务ID
Ppid=243 父进程ID
TracerPid=0 接收跟踪该进程信息的进程的ID号
Uid Uid euid suid fsuid
Gid Gid egid sgid fsgid
FDSize=32 文件描述符的最大个数,最多能打开的文件句柄的个数file->fds
Groups:
VmPeak: 60184 kB /*进程地址空间的大小*/
VmHWM: 18020 kB /*文件内存映射和匿名内存映射的大小*/
VmSize(KB)=1499136 任务虚拟地址空间的大小 (total_vm-reserved_vm),其中total_vm为进程的地址空间的大小,reserved_vm:进程在预留或特殊的内存间的物理页
VmLck(KB)=0 任务已经锁住的物理内存的大小。锁住的物理内存不能交换到硬盘 (locked_vm)
VmRSS(KB)= 344 kB 应用程序正在使用的物理内存的大小,就是用ps命令的参数rss的值 (rss)
VmData(KB)=20KB 程序数据段的大小(所占虚拟内存的大小),存放初始化了的数据; (total_vm-shared_vm-stack_vm)
VmStk(KB)=84KB 任务在用户态的栈的大小 (stack_vm)
VmExe(KB)=4KB 程序所拥有的可执行虚拟内存的大小,代码段,不包括任务使用的库 (end_code-start_code)
VmLib(KB)=1300KB 被映像到任务的虚拟内存空间的库的大小 (exec_lib)
VmPTE=6KB 该进程的所有页表的大小,单位:kb
Threads=1 共享使用该信号描述符的任务的个数,在POSIX多线程序应用程序中,线程组中的所有线程使用同一个信号描述符。
SigQ 待处理信号的个数
SigPnd 屏蔽位,存储了该线程的待处理信号
ShdPnd 屏蔽位,存储了该线程组的待处理信号
SigBlk 存放被阻塞的信号
SigIgn 存放被忽略的信号
SigCgt 存放被俘获到的信号
CapInh Inheritable,能被当前进程执行的程序的继承的能力
CapPrm Permitted,进程能够使用的能力,可以包含CapEff中没有的能力,这些能力是被进程自己临时放弃的,CapEff是CapPrm的一个子集,进程放弃没有必要的能力有利于提高安全性
CapEff Effective,进程的有效能力
四、/proc/loadavg
该文件中的所有值都是从系统启动开始累计到当前时刻。该文件只给出了所有CPU的集合信息,不能该出每个CPU的信息。
/proc # cat loadavg
1.0 1.00 0.93 2/19 301
每个值的含义为:
参数 解释
lavg_1 (1.0) 1-分钟平均负载
lavg_5 (1.00) 5-分钟平均负载
lavg_15(0.93) 15-分钟平均负载
nr_running (2) 在采样时刻,运行队列的任务的数目,与/proc/stat的procs_running表示相同意思
nr_threads (19) 在采样时刻,系统中活跃的任务的个数(不包括运行已经结束的任务)
last_pid(301) 最大的pid值,包括轻量级进程,即线程。
假设当前有两个CPU,则每个CPU的当前任务数为4.61/2=2.31
五、/proc/286/smaps
该文件反映了该进程的相应线性区域的大小
/proc/286 # cat smaps
00008000-00009000 r-xp 00000000 00:0c 1695459 /memtest/mmtest
Size: 4 kB
Rss: 4 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 4 kB
Private_Dirty: 0 kB
00010000-00011000 rw-p 00000000 00:0c 1695459 /memtest/mmtest
Size: 4 kB
Rss: 4 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 4 kB
00011000-00012000 rwxp 00011000 00:00 0 [heap]
Size: 4 kB
Rss: 0 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 0 kB
40000000-40019000 r-xp 00000000 00:0c 2413396 /lib/ld-2.3.2.so
Size: 100 kB
Rss: 96 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 96 kB
Private_Dirty: 0 kB
40019000-4001b000 rw-p 40019000 00:00 0
Size: 8 kB
Rss: 8 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 8 kB
40021000-40022000 rw-p 00019000 00:0c 2413396 /lib/ld-2.3.2.so
Size: 4 kB
Rss: 4 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 4 kB
40022000-4014e000 r-xp 00000000 00:0c 2413367 /lib/libc-2.3.2.so
Size: 1200 kB
Rss: 200 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 200 kB
Private_Dirty: 0 kB
4014e000-40152000 ---p 0012c000 00:0c 2413367 /lib/libc-2.3.2.so
Size: 16 kB
Rss: 0 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 0 kB
40152000-4015a000 rw-p 00128000 00:0c 2413367 /lib/libc-2.3.2.so
Size: 32 kB
Rss: 16 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 16 kB
4015a000-4015c000 rw-p 4015a000 00:00 0
Size: 8 kB
Rss: 8 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 8 kB
be8f1000-be906000 rwxp be8f1000 00:00 0 [stack]
Size: 84 kB
Rss: 4 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 4 kB
解释说明:
每行数据格式如下:
(内存区域)开始-结束 访问权限 偏移 主设备号:次设备号 i节点 文件。
be8f1000-be906000 rwxp be8f1000 00:00 0 [stack]
Size:相应虚拟地址空间的大小
RSS: 正在使用的物理内存的大小
Shared_Clean: 共享区域的未使用页数
Shared_Dirty: 共享区域已经使用的页数
Private_Clean: 私有区域未使用的页数
Private_Dirty: 私有区域已经使用的页数
六、/proc/pid/maps
该文件反映了进程占用的内存区域
/proc/286 # cat maps
00008000-00009000 r-xp 00000000 00:0c 1695459 /memtest/mmtest
00010000-00011000 rw-p 00000000 00:0c 1695459 /memtest/mmtest
00011000-00012000 rwxp 00011000 00:00 0 [heap]
40000000-40019000 r-xp 00000000 00:0c 2413396 /lib/ld-2.3.2.so
40019000-4001b000 rw-p 40019000 00:00 0
40021000-40022000 rw-p 00019000 00:0c 2413396 /lib/ld-2.3.2.so
40022000-4014e000 r-xp 00000000 00:0c 2413367 /lib/libc-2.3.2.so
4014e000-40152000 ---p 0012c000 00:0c 2413367 /lib/libc-2.3.2.so
40152000-4015a000 rw-p 00128000 00:0c 2413367 /lib/libc-2.3.2.so
4015a000-4015c000 rw-p 4015a000 00:00 0
be8f1000-be906000 rwxp be8f1000 00:00 0 [stack]
每行数据格式如下:
(内存区域)开始-结束 访问权限 偏移 主设备号:次设备号 i节点 文件。/proc文件系统,不是普通的文件系统,而是系统内核的映像,该目录中的文件时存放在系统内存中的,它以文件系统的形式为访问系统内核数据的操作提供接口。
查看内核版本命令:uname -
或者:cat /proc/version
或者:lsb_release -a,可以列出所有版本信息。
/proc文件下有根据进程号排列的信息:
查看进程详细信息到/proc/pid/status下寻找
/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/pid/status文件:
red-hat 6.2下的线程也就是轻量级进程LWP,在/proc/pid下是没有的,它们是使用父进程的系统资源,使用父进程的文件描述符,内存,CPU等资源。
可以看出,linux下进程所有的线程:threads:26,这些事父进程所拥有的线程。
文件描述符;FD size,可以看到
此为,进程打开的文件信息。
Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。
用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的。下面列出的这些文件或子文件夹,并不是都是在你的系统中存在,这取决于你的内核配置和装载的模块。另外,在/proc下还有三个很重要的目录:net,scsi和sys。 Sys目录是可写的,可以通过它来访问或修改内核的参数,而net和scsi则依赖于内核配置。例如,如果系统不支持scsi,则scsi 目录不存在。
除了以上介绍的这些,还有的是一些以数字命名的目录,它们是进程目录。系统中当前运行的每一个进程都有对应的一个目录在/proc下,以进程的 PID号为目录名,它们是读取进程信息的接口。而self目录则是读取进程本身的信息接口,是一个link。
)
下面对整个 /proc 目录作一个大略的介绍.
[number]
在 /proc 目录里, 每个正在运行的进程都有一个以该进程 ID 命名的子目录, 其下包括如下的目录和伪文件:
该文件保存了进程的完整命令行. 如果该进程已经被交换出内存, 或者该进程已经僵死, 那么就没有任何东西在该文件里, 这时候对该文件的读操作将返回零个字符. 该文件以空字符 null 而不是换行符作为结束标志.
[number] /cwd
一个符号连接, 指向进程当前的工作目录. 例如, 要找出进程 20 的 cwd, 你可以:
cd /proc/20/cwd; /bin/pwd
请注意 pwd 命令通常是 shell 内置的, 在这样的情况下可能工作得不是很好(casper 注: pwd 只能显示 /proc/20/cwd, 要是想知道它的工作目录,直接ls -al /proc/20不就好了).
[number] /environ
该文件保存进程的环境变量, 各项之间以空字符分隔, 结尾也可能是一个空字符. 因此, 如果要输出进程 1 的环境变量, 你应该:
(cat /proc/1/environ; echo) | tr ";\000"; ";\n";
(至于为什么想要这么做, 请参阅 lilo(8).)
[number] /exe
也是一个符号连接, 指向被执行的二进制代码. 在 Linux 2.0 或者更早的版本下, 对 exe 特殊文件的 readlink(2) 返回一个如下格式的字符串: [设备号]:节点号
[number] /fd
进 程所打开的每个文件都有一个符号连接在该子目录里, 以文件描述符命名, 这个名字实际上是指向真正的文件的符号连接,(和 exe 记录一样).例如, 0 是标准输入, 1 是标准输出, 2 是标准错误, 等等. 程序有时可能想要读取一个文件却不想要标准输入,或者想写到一个文件却不想将输出送到标准输出去,那么就可以很有效地用如下的办法骗过(假定 -i 是输入文件的标志, 而 -o 是输出文件的标志):
foobar -i /proc/self/fd/0 -o /proc/self/fd/1 ...
这 样就是一个能运转的过滤器. 请注意该方法不能用来在文件里搜索, 这是因为 fd 目录里的文件是不可搜索的. 在 UNIX 类的系统下, /proc/self/fd/N 基本上就与 /dev/fd/N 相同. 实际上, 大多数的 Linux MAKEDEV 脚本都将 /dev/fd 符号连接到 [..]/proc/self/fd 上.
attr:
进程的属性
cmdline:
启动进程时执行的命令
cwd:
指向进程当前工作目录的软链
ll cwd可知是个软连接。
environ:
进程执行时使用的环境变量,文件内容使用null字节('\0')分隔,然后以null字节结束。因此获取进程使用的环境变量使用如下:
(cat /proc/pid/environ; echo) | tr '\000' '\n'
fd:
此目录包含进程打开的所有文件,文件名为文件描述符,目录中每个软连接都会指向进程打开的实际文件。
比如:nginx下:
[email protected]:/proc/22210/fd# ll
total 0
dr-x------ 2 root root 0 Oct 20 17:39 ./
dr-xr-xr-x 9 root root 0 Oct 20 17:22 ../
lrwx------ 1 root root 64 Oct 20 17:39 0 -> /dev/null
lrwx------ 1 root root 64 Oct 20 17:39 1 -> /dev/null
lrwx------ 1 root root 64 Oct 20 17:39 10 -> socket:[2917559817]
l-wx------ 1 root root 64 Oct 20 17:39 2 -> /opt/nginx/logs/error.log
l-wx------ 1 root root 64 Oct 20 17:39 3 -> /opt/nginx/logs/access.log
lrwx------ 1 root root 64 Oct 20 17:39 6 -> socket:[2917557592]
lrwx------ 1 root root 64 Oct 20 17:39 7 -> socket:[2917557593]
l-wx------ 1 root root 64 Oct 20 17:39 8 -> /opt/nginx/logs/error.log
lrwx------ 1 root root 64 Oct 20 17:39 9 -> socket:[2917559816]
limits:
该文件存储了进程的软限制,硬限制等信息。
可以查看该进程允许打开的最大描述字个数。
maps:
address perms offset dev inode pathname
08048000-08056000 r-xp 00000000 03:0c 64593 /usr/sbin/gpm
4001f000-40135000 r-xp 00000000 03:0c 45494 /lib/libc-2.2.4.so
* address:进程占用的地址空间。
* perms:权限集
r = read
w = write
x = execute
s = shared
p = private (copy on write)
* offset:文件偏移量。
* dev:为设备(major:minor)
* inode:设备上的inode。0为没有inode关联互内存区域,通常为:BSS(uninitialized data)
root:
指向进程更目录的软链
smaps:
This file shows memory consumption for each of the process's mappings. For each of mappings there is a series of lines such as the following:
08048000-080bc000 r-xp 00000000 03:02 13130 /bin/bash
Size: 464 kB
Rss: 424 kB
Shared_Clean: 424 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 0 kB
The first of these lines shows the same information as is displayed for the mapping in /proc/[pid]/maps. The remaining lines show the size of
the mapping, the amount of the mapping that is currently resident in RAM, the number of clean and dirty shared pages in the mapping, and the
number of clean and dirty private pages in the mapping.
This file is only present if the CONFIG_MMU kernel configuration option is enabled.
一、/proc/pid/statm
pid/statm包含了在此进程中所有CPU活跃的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。
/proc/1 # cat statm
550 70 62 451 0 97 0
输出解释
CPU 以及CPU0。。。的每行的每个参数意思(以第一行为例)为:
参数 解释 /proc/1/status
Size (pages)= 550 任务虚拟地址空间的大小 VmSize/4
Resident(pages)= 70 应用程序正在使用的物理内存的大小 VmRSS/4
Shared(pages)= 62 共享页数
Trs(pages)= 451 程序所拥有的可执行虚拟内存的大小 VmExe/4
Lrs(pages)= 0 被映像到任务的虚拟内存空间的库的大小 VmLib/4
Drs(pages)= 97 程序数据段和用户态的栈的大小 (VmData+ VmStk )4
dt(pages) 0
二、/proc/pid/stat
pid/stat包含了进程所有CPU活跃的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。
/proc/1 # cat stat
1 (linuxrc) S 0 0 0 0 -1 8388864 50 633 20 4 2 357 72 342 16 0 1 0 22 2252800 70 4294967295 32768 1879936 3199270704 3199269552 1113432 0 0 0 674311 3221479524 0 0 0 0 0 0
每个参数意思为:
参数 解释
pid=1 进程(包括轻量级进程,即线程)号
comm= linuxrc 应用程序或命令的名字
task_state=S 任务的状态,R:runnign, S:sleeping (TASK_INTERRUPTIBLE), D:disk sleep (TASK_UNINTERRUPTIBLE), T: stopped, T:tracing stop,Z:zombie, X:dead
ppid=0 父进程ID
pgid=0 线程组号
sid=0 c该任务所在的会话组ID
tty_nr=0(pts/3) 该任务的tty终端的设备号,INT(0/256)=主设备号,(0-主设备号)=次设备号
tty_pgrp=-1 终端的进程组号,当前运行在该任务所在终端的前台任务(包括shell 应用程序)的PID。
task->flags=8388864进程标志位,查看该任务的特性
min_flt=50该任务不需要从硬盘拷数据而发生的缺页(次缺页)的次数
cmin_flt=633 累计的该任务的所有的waited-for进程曾经发生的次缺页的次数目
maj_flt=20该任务需要从硬盘拷数据而发生的缺页(主缺页)的次数
cmaj_flt=4 累计的该任务的所有的waited-for进程曾经发生的主缺页的次数目
utime=2 该任务在用户态运行的时间,单位为jiffies
stime=357 该任务在核心态运行的时间,单位为jiffies
cutime=72 累计的该任务的所有的waited-for进程曾经在用户态运行的时间,单位为jiffies
cstime=342 累计的该任务的所有的waited-for进程曾经在核心态运行的时间,单位为jiffies
priority=16 任务的动态优先级
nice=0 任务的静态优先级
num_threads=1 该任务所在的线程组里线程的个数
it_real_value=0 由于计时间隔导致的下一个 SIGALRM 发送进程的时延,以 jiffy 为单位.
start_time=22 该任务启动的时间,单位为jiffies
vsize=2252800(bytes) 该任务的虚拟地址空间大小
rss=70(page) 该任务当前驻留物理地址空间的大小
Number of pages the process has in real memory,minu 3 for administrative purpose.
这些页可能用于代码,数据和栈。
rlim=4294967295=0xFFFFFFFF(bytes) 该任务能驻留物理地址空间的最大值
start_code=32768=0x8000 该任务在虚拟地址空间的代码段的起始地址(由连接器决定)
end_code=1879936该任务在虚拟地址空间的代码段的结束地址
start_stack=3199270704=0Xbeb0ff30该任务在虚拟地址空间的栈的开始地址
kstkesp=3199269552 sp(32 位堆栈指针) 的当前值, 与在进程的内核堆栈页得到的一致.
kstkeip=1113432 =0X10FD58 指向将要执行的指令的指针, PC(32 位指令指针)的当前值.
pendingsig=0 待处理信号的位图,记录发送给进程的普通信号
block_sig=0 阻塞信号的位图
sigign=0 忽略的信号的位图
sigcatch=674311被俘获的信号的位图
wchan=3221479524 如果该进程是睡眠状态,该值给出调度的调用点
nswap=0 被swapped的页数
cnswap=0 所有子进程被swapped的页数的和
exit_signal=0 该进程结束时,向父进程所发送的信号
task_cpu(task)=0 运行在哪个CPU上
task_rt_priority=0 实时进程的相对优先级别
task_policy=0 进程的调度策略,0=非实时进程,1=FIFO实时进程;2=RR实时进程
三、/proc/pid/status
包含了所有CPU活跃的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。
/proc/286 # cat status
Name: mmtest
State: R (running)
SleepAVG: 0%
Tgid: 286
Pid: 286
PPid: 243
TracerPid: 0
Uid: 0 0 0 0
Gid: 0 0 0 0
FDSize: 32
Groups:
VmPeak: 1464 kB
VmSize: 1464 kB
VmLck: 0 kB
VmHWM: 344 kB
VmRSS: 344 kB
VmData: 20 kB
VmStk: 84 kB
VmExe: 4 kB
VmLib: 1300 kB
VmPTE: 6 kB
Threads: 1
SigQ: 0/256
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000000
SigCgt: 0000000000000000
CapInh: 0000000000000000
CapPrm: 00000000fffffeff
CapEff: 00000000fffffeff
输出解释
参数 解释
Name 应用程序或命令的名字
State 任务的状态,运行/睡眠/僵死/
SleepAVG 任务的平均等待时间(以nanosecond为单位),交互式任务因为休眠次数多、时间长,它们的 sleep_avg 也会相应地更大一些,所以计算出来的优先级也会相应高一些。
Tgid=286 线程组号
Pid=286 任务ID
Ppid=243 父进程ID
TracerPid=0 接收跟踪该进程信息的进程的ID号
Uid Uid euid suid fsuid
Gid Gid egid sgid fsgid
FDSize=32 文件描述符的最大个数,最多能打开的文件句柄的个数file->fds
Groups:
VmPeak: 60184 kB /*进程地址空间的大小*/
VmHWM: 18020 kB /*文件内存映射和匿名内存映射的大小*/
VmSize(KB)=1499136 任务虚拟地址空间的大小 (total_vm-reserved_vm),其中total_vm为进程的地址空间的大小,reserved_vm:进程在预留或特殊的内存间的物理页
VmLck(KB)=0 任务已经锁住的物理内存的大小。锁住的物理内存不能交换到硬盘 (locked_vm)
VmRSS(KB)= 344 kB 应用程序正在使用的物理内存的大小,就是用ps命令的参数rss的值 (rss)
VmData(KB)=20KB 程序数据段的大小(所占虚拟内存的大小),存放初始化了的数据; (total_vm-shared_vm-stack_vm)
VmStk(KB)=84KB 任务在用户态的栈的大小 (stack_vm)
VmExe(KB)=4KB 程序所拥有的可执行虚拟内存的大小,代码段,不包括任务使用的库 (end_code-start_code)
VmLib(KB)=1300KB 被映像到任务的虚拟内存空间的库的大小 (exec_lib)
VmPTE=6KB 该进程的所有页表的大小,单位:kb
Threads=1 共享使用该信号描述符的任务的个数,在POSIX多线程序应用程序中,线程组中的所有线程使用同一个信号描述符。
SigQ 待处理信号的个数
SigPnd 屏蔽位,存储了该线程的待处理信号
ShdPnd 屏蔽位,存储了该线程组的待处理信号
SigBlk 存放被阻塞的信号
SigIgn 存放被忽略的信号
SigCgt 存放被俘获到的信号
CapInh Inheritable,能被当前进程执行的程序的继承的能力
CapPrm Permitted,进程能够使用的能力,可以包含CapEff中没有的能力,这些能力是被进程自己临时放弃的,CapEff是CapPrm的一个子集,进程放弃没有必要的能力有利于提高安全性
CapEff Effective,进程的有效能力
四、/proc/loadavg
该文件中的所有值都是从系统启动开始累计到当前时刻。该文件只给出了所有CPU的集合信息,不能该出每个CPU的信息。
/proc # cat loadavg
1.0 1.00 0.93 2/19 301
每个值的含义为:
参数 解释
lavg_1 (1.0) 1-分钟平均负载
lavg_5 (1.00) 5-分钟平均负载
lavg_15(0.93) 15-分钟平均负载
nr_running (2) 在采样时刻,运行队列的任务的数目,与/proc/stat的procs_running表示相同意思
nr_threads (19) 在采样时刻,系统中活跃的任务的个数(不包括运行已经结束的任务)
last_pid(301) 最大的pid值,包括轻量级进程,即线程。
假设当前有两个CPU,则每个CPU的当前任务数为4.61/2=2.31
五、/proc/286/smaps
该文件反映了该进程的相应线性区域的大小
/proc/286 # cat smaps
00008000-00009000 r-xp 00000000 00:0c 1695459 /memtest/mmtest
Size: 4 kB
Rss: 4 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 4 kB
Private_Dirty: 0 kB
00010000-00011000 rw-p 00000000 00:0c 1695459 /memtest/mmtest
Size: 4 kB
Rss: 4 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 4 kB
00011000-00012000 rwxp 00011000 00:00 0 [heap]
Size: 4 kB
Rss: 0 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 0 kB
40000000-40019000 r-xp 00000000 00:0c 2413396 /lib/ld-2.3.2.so
Size: 100 kB
Rss: 96 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 96 kB
Private_Dirty: 0 kB
40019000-4001b000 rw-p 40019000 00:00 0
Size: 8 kB
Rss: 8 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 8 kB
40021000-40022000 rw-p 00019000 00:0c 2413396 /lib/ld-2.3.2.so
Size: 4 kB
Rss: 4 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 4 kB
40022000-4014e000 r-xp 00000000 00:0c 2413367 /lib/libc-2.3.2.so
Size: 1200 kB
Rss: 200 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 200 kB
Private_Dirty: 0 kB
4014e000-40152000 ---p 0012c000 00:0c 2413367 /lib/libc-2.3.2.so
Size: 16 kB
Rss: 0 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 0 kB
40152000-4015a000 rw-p 00128000 00:0c 2413367 /lib/libc-2.3.2.so
Size: 32 kB
Rss: 16 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 16 kB
4015a000-4015c000 rw-p 4015a000 00:00 0
Size: 8 kB
Rss: 8 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 8 kB
be8f1000-be906000 rwxp be8f1000 00:00 0 [stack]
Size: 84 kB
Rss: 4 kB
Shared_Clean: 0 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 4 kB
解释说明:
每行数据格式如下:
(内存区域)开始-结束 访问权限 偏移 主设备号:次设备号 i节点 文件。
be8f1000-be906000 rwxp be8f1000 00:00 0 [stack]
Size:相应虚拟地址空间的大小
RSS: 正在使用的物理内存的大小
Shared_Clean: 共享区域的未使用页数
Shared_Dirty: 共享区域已经使用的页数
Private_Clean: 私有区域未使用的页数
Private_Dirty: 私有区域已经使用的页数
六、/proc/pid/maps
该文件反映了进程占用的内存区域
/proc/286 # cat maps
00008000-00009000 r-xp 00000000 00:0c 1695459 /memtest/mmtest
00010000-00011000 rw-p 00000000 00:0c 1695459 /memtest/mmtest
00011000-00012000 rwxp 00011000 00:00 0 [heap]
40000000-40019000 r-xp 00000000 00:0c 2413396 /lib/ld-2.3.2.so
40019000-4001b000 rw-p 40019000 00:00 0
40021000-40022000 rw-p 00019000 00:0c 2413396 /lib/ld-2.3.2.so
40022000-4014e000 r-xp 00000000 00:0c 2413367 /lib/libc-2.3.2.so
4014e000-40152000 ---p 0012c000 00:0c 2413367 /lib/libc-2.3.2.so
40152000-4015a000 rw-p 00128000 00:0c 2413367 /lib/libc-2.3.2.so
4015a000-4015c000 rw-p 4015a000 00:00 0
be8f1000-be906000 rwxp be8f1000 00:00 0 [stack]
每行数据格式如下:
(内存区域)开始-结束 访问权限 偏移 主设备号:次设备号 i节点 文件。/proc文件系统,不是普通的文件系统,而是系统内核的映像,该目录中的文件时存放在系统内存中的,它以文件系统的形式为访问系统内核数据的操作提供接口。
查看内核版本命令:uname -
或者:cat /proc/version
或者:lsb_release -a,可以列出所有版本信息。
/proc文件下有根据进程号排列的信息:
查看进程详细信息到/proc/pid/status下寻找
/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/pid/status文件:
red-hat 6.2下的线程也就是轻量级进程LWP,在/proc/pid下是没有的,它们是使用父进程的系统资源,使用父进程的文件描述符,内存,CPU等资源。
可以看出,linux下进程所有的线程:threads:26,这些事父进程所拥有的线程。
文件描述符;FD size,可以看到
此为,进程打开的文件信息。