Linux的/proc虛擬文件系統
Linux系統上的/proc目錄是一種文件系統,即proc文件系統。與其它常見的文件系統不同的是,/proc是一種偽文件系統(也即虛擬文件系統),存儲的是當前內核運行狀態的一系列特殊文件,用戶可以通過這些文件查看有關系統硬件及當前正在運行進程的信息,甚至可以通過更改其中某些文件來改變內核的運行狀態。
基於/proc文件系統如上所述的特殊性,其內的文件也常被稱作虛擬文件,並具有一些獨特的特點。例如,其中有些文件雖然使用查看命令查看時會返回大量信息,但文件本身的大小卻會顯示為0字節。此外,這些特殊文件中大多數文件的時間及日期屬性通常為當前系統時間和日期,這跟它們隨時會被刷新(存儲於RAM中)有關。
為了查看及使用上的方便,這些文件通常會按照相關性進行分類存儲於不同的目錄甚至子目錄中,如/proc/scsi目錄中存儲的就是當前系統上所有SCSI設備的相關信息,/proc/N中存儲的則是系統當前正在運行的進程的相關信息,其中N為正在運行的進程(可以想象得到,在某進程結束後其相關目錄則會消失)。
大多數虛擬文件可以使用文件查看命令如cat、more或者less進行查看,有些文件信息表述的內容可以一目了然,但也有文件的信息卻不怎麼具有可讀性。不過,這些可讀性較差的文件在使用一些命令如apm、free、lspci或top查看時卻可以有著不錯的表現。
一、進程信息
在/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/fd/ 目錄提供 了有關打開文件的信息。要查看被進程使用的輸入文件,使用以下命令 :
ls –l /proc/pid/fd/0
查看被進程使用socket,使用以下命令 :
ls –l /proc/pid/fd|sed –n `/socket/{s/.*\[//;s/\]//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系統的維護和管理能提供非常大的幫助。
四、一個簡單的用來排查CPU占用過高的應用程序的例子:
執行top
比如,第一行的mysqld,我要查看他的執行文件和打開了哪些文件,從圖中可以看到對應的PID為29792
執行 ls -l /proc/29792
圖中藍色cwd表示該應用所在的路徑,藍色exe表示該執行文件名稱與位置,藍色fd目錄內列出該應用打開了哪些文件