本文将通过一个简单易懂的例子说明如何使用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这样一个进程:
#psroot 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 swaps10 1799 1923 2056 2108 9 ide misc sys11 1809 1924 2063 2111 apm interrupts modules sysvipc1491 1818 1925 2065 2138 bus iomem mounts tty1550 1829 1968 2067 2162 cmdline ioports mtrr uptime1554 1893 1969 2069 2163 cpuinfo irq net version1572 19 1978 2071 3 devices kcore partitions1591 1902 2 2073 4 dma kmsg pci1670 1911 2032 2074 5 driver ksyms scsi1720 1919 2043 2079 6 execdomains loadavg self1757 1920 2045 2081 7 fb locks slabinfo1771 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 //进程组IDPid: 2108 //进程IDPPid: 2083 //父进程IDTracerPid: 0 //跟踪调试进程IDUid: 0 0 0 0 //进程所对应程序的UIDGid: 0 0 0 0 //进程所对应程序的GIDFDSize: 256 //进程使用文件句柄大小Groups: 0 1 2 3 4 10 10 //组信息//进程所使用的虚拟内存以及实际内存、信号机制方面的信息VmSize: 1344 kBVmLck: 0 kBVmRSS: 224 kBVmData: 12 kBVmStk: 16 kBVmExe: 4 kBVmLib: 1292 kBSigPnd: 0000000000000000SigBlk: 0000000000000000SigIgn: 8000000000000000SigCgt: 0000000000000000CapInh: 0000000000000000CapPrm: 00000000fffffeffCapEff: 00000000fffffeff这样,我们就可以知道进程使用的虚拟内存、以及实际内存、信号机制方面的信息了。