本文将通过一个简单易懂的例子说明如何使用Linux下的PROC文件系统来获得进程的信息。通过PROC文件系统获取的信息主要是进程使用的虚拟内存、以及实际内存、信号机制方面的信息,和Linux下的其他监控工具搭配,能够对系统运行的情况有一个全面的掌握。首先提供一段PROC文件系统的简单介绍:

PROC文件系统是一个虚拟的文件系统,通过文件系统的接口实现,用于输出系统的运行状态。它以文件系统的形式,为操作系统本身和应用进程之间的通信提供了一个界面,使应用程序能够安全、方便地获得系统当前的运行状况和内核的内部数据信息,并可以修改某些系统的配置信息。另外,由于PROC以文件系统的接口实现,因此用户可以像访问普通文件一样对其进行访问,但它只存在于内存之中,并不存在于真正的物理磁盘当中。所以,当系统重启和电源关闭的时候,该系统中的数据和信息将全部消失。

表1说明了该文件系统中一些重要的文件和目录。

表1 重要的PROC文件系统文件和目录

文件或目录 说    明
/proc/1 关于进程1的信息目录。每个进程在/proc下有一个名为其进程号的目录
/proc/cpuinfo 处理器信息,如类型、制造商、型号和性能
/proc/devices 当前运行的核心配置的设备驱动的列表
/proc/dma 显示当前使用的DMA通道
/proc/filesystems 核心配置的文件系统
/proc/interrupts 显示使用的中断
/proc/ioports 当前使用的I/O端口
/proc/kcore 系统物理内存映像
/proc/kmsg 核心输出的消息,也被送到syslog
/proc/ksyms 核心符号表
/proc/loadavg 系统的平均负载
/proc/meminfo 存储器使用信息,包括物理内存和swap
/proc/modules 当前加载了哪些核心模块
/proc/net 网络协议状态信息
/proc/stat 系统的不同状态
/proc/version 核心版本
/proc/uptime 系统启动的时间长度

值得注意的是:所有上述文件给出易读的文本文件,有时可能是不易读的格式。有许多命令做了些格式化以更容易读。例如,free程序读/proc/meminfo并将给出的字节数转换为千字节(并增加了一些信息)。


下面将通过例子来说明如何使用PROC文件系统来获得进程的信息。

首先使用vi编辑器建立一个c源程序文件,编译后形成目标文件,该文件的主要功能是进行计算,将其保存在/root目录下,下面将其运行:

#cd /root                       //切换目录
#./calculate                    //运行该程序,则生成了以该程序为名称的进程

使用ps命令,则能发现在系统中运行了calculate这样一个进程:

#ps
root      2108 61.2 0.1 1344 224 pts/0    R    21:20   0:11 ./calculate
……

进程的基本信息都会存放在/proc文件系统中,具体位置是在/proc目录下。通过使用如下命令可以查看系统中运行进程的相关信息:

# ls /proc                      //查看/proc目录下的内容
//如下显示为系统中运行进程的信息所存放的目录,每个进程对应一个目录,加蓝的2108为本例使用的进程的详细信息所在目录
1     1790 1922 2049 2083 8            fs          meminfo     swaps
10    1799 1923 2056 2108 9            ide         misc        sys
11    1809 1924 2063 2111 apm          interrupts modules     sysvipc
1491 1818 1925 2065 2138 bus          iomem       mounts      tty
1550 1829 1968 2067 2162 cmdline      ioports     mtrr        uptime
1554 1893 1969 2069 2163 cpuinfo      irq         net         version
1572 19    1978 2071 3     devices      kcore       partitions
1591 1902 2     2073 4     dma          kmsg        pci
1670 1911 2032 2074 5     driver       ksyms       scsi
1720 1919 2043 2079 6     execdomains loadavg     self
1757 1920 2045 2081 7     fb           locks       slabinfo
1771 1921 2047 2082 77    filesystems mdstat      stat
#cd 2108                        //切换到2108目录,以方便详细的查看进程信息
#ls                             //列出进程详细的状态信息文件
cmdline cwd environ exe fd maps mem mounts root stat statm status

在这些文件当中,status这个状态文件是比较重要的,包含了很多关于进程的有用的信息,用户可以从这个文件获得信息,如下为列出该文件内容的操作:

#cat status                     //使用cat命令列出status文件内容
Name:   calculate               //进程名
State: R (running)             //进程运行状态
Tgid:   2108                    //进程组ID
Pid:    2108                     //进程ID
PPid:   2083                    //父进程ID
TracerPid:      0                //跟踪调试进程ID
Uid:    0       0       0       0   //进程所对应程序的UID
Gid:    0       0       0       0   //进程所对应程序的GID
FDSize: 256                     //进程使用文件句柄大小
Groups: 0 1 2 3 4 10 10         //组信息
//进程所使用的虚拟内存以及实际内存、信号机制方面的信息
VmSize:     1344 kB
VmLck:         0 kB
VmRSS:       224 kB
VmData:       12 kB
VmStk:        16 kB
VmExe:         4 kB
VmLib:      1292 kB
SigPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 8000000000000000
SigCgt: 0000000000000000
CapInh: 0000000000000000
CapPrm: 00000000fffffeff
CapEff: 00000000fffffeff

这样,我们就可以知道进程使用的虚拟内存、以及实际内存、信号机制方面的信息了。