理解/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

推荐阅读