1. 程式人生 > >Linux /proc/pid目錄下相應文件的信息說明和含義

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

調用 port 利用 code 就是 fin CA abc IV

Proc是一個虛擬文件系統,在Linux系統中它被掛載於/proc目錄之上。Proc有多個功能 ,這其中包括用戶可以通過它訪問內核信息或用於排錯,這其中一個非常有 用的功能,也是Linux變得更加特別的功能就是以文本流的形式來訪問進程信息。很Linux命令(比如 ps、toPpstree等)都需要使用這個文件系統的信息。註意,本文就是向用戶介紹一些訪問這些信息的方法 。需要說明的是,本文所述的內容並不 一定適用所有內核版本,有部分操作只適用於2.6內核。
一、進程信息
在/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/ 目錄提供 了有關打開文件的信息。要查看被進程使用的輸入文件,使用以下命令:

ls –l /proc/pid/fd/0

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

netstat --ae

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

grep Free /proc/meminfo

◆ 自從系統最後一次啟動後的系統統計可以從/proc/stat文件中獲取 :
#grep processes /proc/stat
◆ 獲知第 1、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信息,使用以下命令 :

cat /proc/cpuinfo

◆ 要獲知swap空間的使用情況 ,使用以下命令:

cat /proc/swaps

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

cat /proc/fs/nfsd/exports

三、相關內核的信息
這是一個非常寬泛的主題,這裏只介紹其中一小部分內容:
◆ 從正在運行的內核中獲知內核的版本:
#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 目錄不存在。

除了以上介紹的這些,還有的是一些以數字命名的目錄,它們是進程目錄。系統中當前運行的每一個進程都有對應的一個目錄在/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 上.
]

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