簡單案例教你用PROC文件系統(tǒng)獲取進(jìn)程信息
原創(chuàng)【51CTO獨(dú)家特稿】本文將通過一個(gè)簡單易懂的例子說明如何使用Linux下的PROC文件系統(tǒng)來獲得進(jìn)程的信息。通過PROC文件系統(tǒng)獲取的信息主要是進(jìn)程使用的虛擬內(nèi)存、以及實(shí)際內(nèi)存、信號機(jī)制方面的信息,和Linux下的其他監(jiān)控工具搭配,能夠?qū)ο到y(tǒng)運(yùn)行的情況有一個(gè)全面的掌握。首先提供一段PROC文件系統(tǒng)的簡單介紹:
PROC文件系統(tǒng)是一個(gè)虛擬的文件系統(tǒng),通過文件系統(tǒng)的接口實(shí)現(xiàn),用于輸出系統(tǒng)的運(yùn)行狀態(tài)。它以文件系統(tǒng)的形式,為操作系統(tǒng)本身和應(yīng)用進(jìn)程之間的通信提供了一個(gè)界面,使應(yīng)用程序能夠安全、方便地獲得系統(tǒng)當(dāng)前的運(yùn)行狀況和內(nèi)核的內(nèi)部數(shù)據(jù)信息,并可以修改某些系統(tǒng)的配置信息。另外,由于PROC以文件系統(tǒng)的接口實(shí)現(xiàn),因此用戶可以像訪問普通文件一樣對其進(jìn)行訪問,但它只存在于內(nèi)存之中,并不存在于真正的物理磁盤當(dāng)中。所以,當(dāng)系統(tǒng)重啟和電源關(guān)閉的時(shí)候,該系統(tǒng)中的數(shù)據(jù)和信息將全部消失。
表1說明了該文件系統(tǒng)中一些重要的文件和目錄。
表1 重要的PROC文件系統(tǒng)文件和目錄
文件或目錄 | 說 明 |
/proc/1 | 關(guān)于進(jìn)程1的信息目錄。每個(gè)進(jìn)程在/proc下有一個(gè)名為其進(jìn)程號的目錄 |
/proc/cpuinfo | 處理器信息,如類型、制造商、型號和性能 |
/proc/devices | 當(dāng)前運(yùn)行的核心配置的設(shè)備驅(qū)動(dòng)的列表 |
/proc/dma | 顯示當(dāng)前使用的DMA通道 |
/proc/filesystems | 核心配置的文件系統(tǒng) |
/proc/interrupts | 顯示使用的中斷 |
/proc/ioports | 當(dāng)前使用的I/O端口 |
/proc/kcore | 系統(tǒng)物理內(nèi)存映像 |
/proc/kmsg | 核心輸出的消息,也被送到syslog |
/proc/ksyms | 核心符號表 |
/proc/loadavg | 系統(tǒng)的平均負(fù)載 |
/proc/meminfo | 存儲(chǔ)器使用信息,包括物理內(nèi)存和swap |
/proc/modules | 當(dāng)前加載了哪些核心模塊 |
/proc/net | 網(wǎng)絡(luò)協(xié)議狀態(tài)信息 |
/proc/stat | 系統(tǒng)的不同狀態(tài) |
/proc/version | 核心版本 |
/proc/uptime | 系統(tǒng)啟動(dòng)的時(shí)間長度 |
值得注意的是:所有上述文件給出易讀的文本文件,有時(shí)可能是不易讀的格式。有許多命令做了些格式化以更容易讀。例如,free程序讀/proc/meminfo并將給出的字節(jié)數(shù)轉(zhuǎn)換為千字節(jié)(并增加了一些信息)。
下面將通過例子來說明如何使用PROC文件系統(tǒng)來獲得進(jìn)程的信息。
首先使用vi編輯器建立一個(gè)c源程序文件,編譯后形成目標(biāo)文件,該文件的主要功能是進(jìn)行計(jì)算,將其保存在/root目錄下,下面將其運(yùn)行:
#cd /root //切換目錄 #./calculate //運(yùn)行該程序,則生成了以該程序?yàn)槊Q的進(jìn)程
使用ps命令,則能發(fā)現(xiàn)在系統(tǒng)中運(yùn)行了calculate這樣一個(gè)進(jìn)程:
#ps root 2108 61.2 0.1 1344 224 pts/0 R 21:20 0:11 ./calculate ……
進(jìn)程的基本信息都會(huì)存放在/proc文件系統(tǒng)中,具體位置是在/proc目錄下。通過使用如下命令可以查看系統(tǒng)中運(yùn)行進(jìn)程的相關(guān)信息:
# ls /proc //查看/proc目錄下的內(nèi)容
//如下顯示為系統(tǒng)中運(yùn)行進(jìn)程的信息所存放的目錄,每個(gè)進(jìn)程對應(yīng)一個(gè)目錄,加藍(lán)的2108為本例使用的進(jìn)程的詳細(xì)信息所在目錄
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目錄,以方便詳細(xì)的查看進(jìn)程信息
#ls //列出進(jìn)程詳細(xì)的狀態(tài)信息文件
cmdline cwd environ exe fd maps mem mounts root stat statm status
在這些文件當(dāng)中,status這個(gè)狀態(tài)文件是比較重要的,包含了很多關(guān)于進(jìn)程的有用的信息,用戶可以從這個(gè)文件獲得信息,如下為列出該文件內(nèi)容的操作:
#cat status //使用cat命令列出status文件內(nèi)容 Name: calculate //進(jìn)程名 State: R (running) //進(jìn)程運(yùn)行狀態(tài) Tgid: 2108 //進(jìn)程組ID Pid: 2108 //進(jìn)程ID PPid: 2083 //父進(jìn)程ID TracerPid: 0 //跟蹤調(diào)試進(jìn)程ID Uid: 0 0 0 0 //進(jìn)程所對應(yīng)程序的UID Gid: 0 0 0 0 //進(jìn)程所對應(yīng)程序的GID FDSize: 256 //進(jìn)程使用文件句柄大小 Groups: 0 1 2 3 4 10 10 //組信息 //進(jìn)程所使用的虛擬內(nèi)存以及實(shí)際內(nèi)存、信號機(jī)制方面的信息 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
這樣,我們就可以知道進(jìn)程使用的虛擬內(nèi)存、以及實(shí)際內(nèi)存、信號機(jī)制方面的信息了。
【編輯推薦】