Linux /proc/pid目錄下相應文件的信息說明和含義

Proc是一個虛擬文件系統,在Linux系統中它被掛載於/proc目錄之上。Proc有多個功能 ,這其中包括用戶能夠經過它訪問內核信息或用於排錯,這其中一個很是有 用的功能,也是Linux變得更加特別的功能就是以文本流的形式來訪問進程信息。很Linux命令(好比 ps、toPpstree等)都須要使用這個文件系統的信息。注意,本文就是向用戶介紹一些訪問這些信息的方法 。須要說明的是,本文所述的內容並不 必定適用全部內核版本,有部分操做只適用於2.6內核。
1、進程信息
在/proc文件系統中,每個進程都有一個相應的文件 。下面是/proc目錄下的一些重要文件 :
/proc/pid/cmdline 包含了用於開始進程的命令 ;
/proc/pid/cwd包含了當前進程工做目錄的一個連接 ;
/proc/pid/environ 包含了可用進程環境變量的列表 ;
/proc/pid/exe 包含了正在進程中運行的程序連接;
/proc/pid/fd/ 這個目錄包含了進程打開的每個文件的連接;
/proc/pid/mem 包含了進程在內存中的內容;
/proc/pid/stat包含了進程的狀態信息;
/proc/pid/statm 包含了進程的內存使用信息。
下面是一些獲取進程信息的例子:
◆ 假設如今要查看是否全部的進程都會作存儲器清除工做。在/proc/pid/stat文件中的每一 個進程標識 (第8個屬性)提供了有關進程的不少 「我的」信 息。這個信 息能夠對每個 進程標識進行。
0x00000002 Process being created
0x00000004 Exiting
0x00000008 Dead
0x00000040 Process using
superuser privflage
0x00000200 P rocess dumping core
0x00000400 Prooess received some signal
0x00000800 Process allocating memory
0x00001000 Killed due to out-of--memory condition
筆者從/usr/src/linux/include/linux/sched.h 中提取了這些信息。
◆ /proc/pid/fd/ 目錄提供 了有關打開文件的信息。要查看被進程使用的輸入文件,使用如下命令:linux

ls –l /proc/pid/fd/0

◆ 查看被進程使用socket,使用如下命令 :
#ls –l /proc/pid/fd|sed –n /socket/{s/.*<br/>//;s/<br/>//;s/<br/>//p}
有關這些socket的信息可使用如下命令獲取 :shell

netstat --ae

◆ 要將命令行參數傳遞給任意進程,使用如下命令 :
~~cat /proc/pid/cmdline
◆ 要 獲取某一進程父進程的ID號,使用如下命令:
#grep PPid/proc/pid/status
2、普通的系統信息
Proc包含了不少系統信息,這其中包括CPU負載、文件系統和網絡配置 。下面是一些經過Proc查看和更改系統的例子:
◆ 獲取可用系統內存的空間 :網絡

grep Free /proc/meminfo

◆ 自從系統最後一次啓動後的系通通計能夠從/proc/stat文件中獲取 :
#grep processes /proc/stat
◆ 獲知第 一、5和15分鐘系統負載的平均值 :
#awk {print 「1 min:\t」 $1 「\n5 min:\t」 $2 「\n15 min:\t」 $3} /proc/loadavg
◆ /proc/partitions可用於獲取系統的分區信息 。
◆ /proc/net和/proc/sys/net可用於查看和更改重要的網絡信息。好比,禁用ping命令,能夠以root身份運行如下命令 :
#echo 1>/proc/sys/net/ipv4/icmp_echo_ignore_all
若是要啓用IP轉發/IP假裝,使用如下命令 :
#echo 1> /proc/sys/net/ipv4/ip_forward
◆ 已經掛載的文件系統信息能夠從/proc/mounts中檢索。
◆ 要改變正在使用的主機名 ,使用如下命令:數據結構

echo www.abc.corn >/proc/sys/kernel/hostname

◆ 要獲取CPU信息,使用如下命令 :socket

cat /proc/cpuinfo

◆ 要獲知swap空間的使用狀況 ,使用如下命令:ide

cat /proc/swaps

◆ 獲取系統的正常運行時間:
#cat /proc/uptime
◆ 列出由NFS共享的文件系統:ui

cat /proc/fs/nfsd/exports

3、相關內核的信息
這是一個很是寬泛的主題,這裏只介紹其中一小部份內容:
◆ 從正在運行的內核中獲知內核的版本:
#cat /proc/version
◆ /proc/kmsg文件被做爲內核日誌信息源,它能夠被做爲一個系統信息調用的接口使用。
◆ /proc/kcore文件提供了之內核文件格式形式訪問系統物理內存,而且能夠被gdb用於檢查任意內核數據結構的當前狀態。若是裝了源碼,那麼能夠經過查看/usr/src/linux/Documentation/filesystems/proc.txt文件來獲取更多的信息 。
從中能夠看出來,Proc是一個很是不錯的獲取系統信息渠道。若是利用得好,則它對Linux系統的維護和管理能提供很是大的幫助。命令行

【各個文件含義】
/proc 是一個僞文件系統, 被用做內核數據結構的接口, 而不只僅是解釋說明/dev/kmem.
/proc 裏的大多數文件都是隻讀的, 但也能夠經過寫一些文件來改變內核變量.
(
Linux 內核提供了一種經過 /proc 文件系統,在運行時訪問內核內部數據結構、改變內核設置的機制。proc文件系統是一個僞文件系統,它只存在內存當中,而不佔用外存空間。它以文件系統的方式爲訪問系統內核數據的操做提供接口。日誌

用戶和應用程序能夠經過proc獲得系統的信息,並能夠改變內核的某些參數。因爲系統的信息,如進程,是動態改變的,因此用戶或應用程序讀取proc文件時,proc文件系統是動態從系統內核讀出所需信息並提交的。下面列出的這些文件或子文件夾,並非都是在你的系統中存在,這取決於你的內核配置和裝載的模塊。另外,在/proc下還有三個很重要的目錄:net,scsi和sys。 Sys目錄是可寫的,能夠經過它來訪問或修改內核的參數,而net和scsi則依賴於內核配置。例如,若是系統不支持scsi,則scsi 目錄不存在。code

除了以上介紹的這些,還有的是一些以數字命名的目錄,它們是進程目錄。系統中當前運行的每個進程都有對應的一個目錄在/proc下,以進程的 PID號爲目錄名,它們是讀取進程信息的接口。而self目錄則是讀取進程自己的信息接口,是一個link。

)

下面對整個 /proc 目錄做一個大略的介紹.

[number]在 /proc 目錄裏, 每一個正在運行的進程都有一個以該進程 ID 命名的子目錄, 其下包括以下的目錄和僞文件:[number] /cmdline該文件保存了進程的完整命令行. 若是該進程已經被交換出內存, 或者該進程已經僵死, 那麼就沒有任何東西在該文件裏, 這時候對該文件的讀操做將返回零個字符. 該文件以空字符 null 而不是換行符做爲結束標誌.[number] /cwd一個符號鏈接, 指向進程當前的工做目錄. 例如, 要找出進程 20 的 cwd, 你能夠:cd /proc/20/cwd; /bin/pwd請注意 pwd 命令一般是 shell 內置的, 在這樣的狀況下可能工做得不是很好(casper 注: pwd 只能顯示 /proc/20/cwd, 要是想知道它的工做目錄,直接ls -al /proc/20不就行了).[number] /environ該文件保存進程的環境變量, 各項之間以空字符分隔, 結尾也多是一個空字符. 所以, 若是要輸出進程 1 的環境變量, 你應該:(cat /proc/1/environ; echo) | tr ";\000"; ";\n";(至於爲何想要這麼作, 請參閱 lilo(8).)[number] /exe也是一個符號鏈接, 指向被執行的二進制代碼. 在 Linux 2.0 或者更早的版本下, 對 exe 特殊文件的 readlink(2) 返回一個以下格式的字符串: [設備號]:節點號舉個例子, [0301]:1502 就是某設備的 1502 節點, 該設備的主設備號爲 03 (如 IDE, MFM 等驅動器), 從設備號爲 01 (第一個驅動器的第一分區). 而在 Linux 2.2 下, readlink(2) 則給出命令的實際路徑名. 另外, 該符號鏈接也能夠正常析引用(試圖打開 exe 文件實際上將打開一個可執行文件). 你甚至能夠鍵入 /proc/[number]/exe 來運行 [number] 進程的副本. 帶 -inum 選項的 find(1) 命令能夠定位該文件.[number] /fd進 程所打開的每一個文件都有一個符號鏈接在該子目錄裏, 以文件描述符命名, 這個名字其實是指向真正的文件的符號鏈接,(和 exe 記錄同樣).例如, 0 是標準輸入, 1 是標準輸出, 2 是標準錯誤, 等等. 程序有時可能想要讀取一個文件卻不想要標準輸入,或者想寫到一個文件卻不想將輸出送到標準輸出去,那麼就能夠頗有效地用以下的辦法騙過(假定 -i 是輸入文件的標誌, 而 -o 是輸出文件的標誌):foobar -i /proc/self/fd/0 -o /proc/self/fd/1 ...這 樣就是一個能運轉的過濾器. 請注意該方法不能用來在文件裏搜索, 這是由於 fd 目錄裏的文件是不可搜索的. 在 UNIX 類的系統下, /proc/self/fd/N 基本上就與 /dev/fd/N 相同. 實際上, 大多數的 Linux MAKEDEV 腳本都將 /dev/fd 符號鏈接到 [..]/proc/self/fd 上.]

相關文章
相關標籤/搜索