(这个是转贴,希望给大家提供帮助,更好地理解/proc文档系统)
不只一次的有人问我关于/proc文档系统,那是什么,那些巨大的文档在那里做什么?我能够删除他们吗?本文将周详介绍/proc文档系统,描述一些工具,您能够通过这些工具领略/proc的威力。最后有一个例子程式,演示了系统管理员如何和/proc交互。
◆ 介绍/proc
在过去那些糟糕的日子里,只能通过直接访问内核内存(/dev/kmem)获取进程数据,比如运行ps(1)命令时。为了实现这种访问,需要终极用户权限,而且步骤相当复杂。Sun公司从UNIX SVR4开始解决了进程数据访问问题,现在,能够简单地通过/proc访问进程数据。
/proc文档系统不是普通意义上的文档系统,他是个到运行中进程地址空间的访问接口。通过/proc,能够用标准Unix系统调用(比如open()、read()、write()、ioctl()等等)访问进程地址空间。事实上,Solaris ps(1)命令正是利用/proc获取进程状态。
S (l) 进程状态:
O 正在运行
S 休眠: 进程正在等待某个事件发生/完成
R 可运行: 进程位于运行队列中
Z 僵尸状态: 进程结束了,但是其父进程未处理SIGCHLD信号
T 进程暂停: 可能是任务控制信号所致,或正在被
跟踪调试
/proc下的大文档对应运行中进程的地址空间,不是标准Unix文档。事实上每个文档名对应运行中进程的PID,文档属主、属组对应进程拥有者的real-uid和primary-gid。权限控制和普通Unix文档相同。文档大小是最令人迷惑的地方,事实上相当好理解,对应进程内存映像大小,并不真正占用硬盘空间,所以您不必担心空间浪费的问题。不要企图删除这些文档!观察图A中列举的/proc例子:
--------------------------------------------------------------------------
$ ls -l /proc
total 43384
-rw------- 1 root root 0 Apr 2 20:07 00000
-rw------- 1 root root 393216 Apr 2 20:07 00001
-rw------- 1 root root 0 Apr 2 20:07 00002
-rw------- 1 root root 0 Apr 2 20:07 00003
-rw------- 1 root root 1695744 Apr 2 20:07 00081
-rw------- 1 root root 1597440 Apr 2 20:07 00083
-rw------- 1 root root 1777664 Apr 2 20:08 00096
-rw------- 1 root root 1683456 Apr 2 20:08 00099
-rw------- 1 root root 1589248 Apr 2 20:08 00101
-rw------- 1 root root 1445888 Apr 2 20:08 00116
-rw------- 1 root root 1404928 Apr 2 20:08 00126
-rw------- 1 root root 798720 Apr 2 20:08 00135
-rw------- 1 root root 1368064 Apr 2 20:08 00195
-rw------- 1 root root 1585152 Apr 2 20:08 00197
-rw------- 1 root root 1368064 Apr 2 20:08 00200
-rw------- 1 root other 225280 Apr 2 20:08 00201
-rw------- 1 root root 1454080 Apr 2 20:08 00203
-rw------- 1 root root 1519616 Apr 2 20:14 00243
-rw------- 1 rthomas wheel 1499136 Apr 2 20:14 00245
-rw------- 1 rthomas wheel 806912 Apr 2 20:16 00261
$
图A: /proc例子
--------------------------------------------------------------------------
操作/proc下文档的方式和操作普通Unix文档相同,能够使用任何您熟悉的系统调用,包括ioctl()。在内核中,针对/proc下文档的vnode操作被转向procfs。这意味着操作vnode的系统调用(比如lookuppn())实际上最终转向procfs-savvy系统调用(比如prlookup())。
◆ /proc能告诉我什么
Solaris下使用/proc的工具相当完善,位于/usr/proc/bin目录中。这些工具提供了一种访问任意指定进程临界数据的简捷办法。比如,想知道一个进程已打开了多少文档,您能够使用crash(1M)(见鬼,我不会),但是您是root吗?不必担心,能够用/usr/proc/bin/pfiles获取这种信息,图B演示了pfiles(1)命令的使用:
--------------------------------------------------------------------------
[scz@ /export/home/scz]> ps
PID TTY TIME CMD
637 pts/3 0:00 bash
[scz@ /export/home/scz]> pfiles 637
637: -bash
Current rlimit: 64 file descriptors
0: S_IFCHR mode:0620 dev:151,0 ino:196787 uid:500 gid:7 rdev:24,3
O_RDWR
1: S_IFCHR mode:0620 dev:151,0 ino:196787 uid:500 gid:7 rdev:24,3
O_RDWR
2: S_IFCHR mode:0620 dev:151,0 ino:196787 uid:500 gid:7 rdev:24,3
O_RDWR
3: S_IFDOOR mode:0444 dev:191,0 ino:1618164880 uid:0 gid:0 size:0
O_RDONLY|O_LARGEFILE FD_CLOEXEC door to nscd[213]
63: S_IFCHR mode:0620 dev:151,0 ino:196787 uid:500 gid:7 rdev:24,3
O_RDWR FD_CLOEXEC
[scz@ /export/home/scz]>
图B: 使用pfiles(1)命令
--------------------------------------------------------------------------
正如上面演示的,/usr/proc/bin下的命令使用很简单,只需要在命令行上指定PID。然而,留心权限许可配置,和任何普通Unix文档相同,您无权访问那些权限配置上禁止访问的指定PID的进程数据。
花点事件看看proc(1)手册页,熟悉其中介绍的命令,您将学会列举指定进程相关的库、进程信号配置、进程信任配置,您甚至能够暂停、重启进程。
◆ 编写/proc工具
/proc的魅力在于他包含了您可能想知道的关于一个进程的任何信息,您只需要简单地从中获取。/usr/include/sys/procfs.h文档中定义了两个结构,prstatus和prpsinfo,从中能够获取指定进程的很多信息。下面是个例子,研发者想知道他的应用程式究竟占用了多少内存。简单!ls /proc就能够知道了。但是,他还想知道更多细节,他需要知道总的映像大小、常驻部分的大小、堆区(heap)大小、栈区(stack)大小。此外,他希望能够定期跟踪这些数据信息,类似vmstat(1M)那种方式。如上所述,听起来象是个令人生畏的任务。
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




