proc目錄介紹(一):目錄結構
Linux系統的/proc目錄介紹
在GUN/Linux操作系統中,/proc是一個位於內存中的偽文件系統(in-memory pseudo-file system)。該目錄下保存的不是真正的文件和目錄,而是一些「運行時」信息,如系統內存、磁碟io、設備掛載信息和硬體配置信息等。proc目錄是一個控制中心,用戶可以通過更改其中某些文件來改變內核的運行狀態。proc目錄也是內核提供給我們的查詢中心,我們可以通過這些文件查看有關係統硬體及當前正在運行進程的信息。在Linux系統中,許多工具的數據來源正是proc目錄中的內容。例如,lsmod命令就是cat /proc/modules命令的別名,lspci命令是cat /proc/pci命令的別名。
proc目錄被稱作虛擬文件系統,自然有些獨特的屬性。如果讀者使用ls命令查看proc目錄下的文件,會發現該目錄下的絕大部分文件大小為0。如下所示:
dr-xr-xr-x 2 root root 0 Apr 29 16:26 acpidr-xr-xr-x 4 root root 0 Apr 29 16:26 asound-r--r--r-- 1 root root 0 Apr 29 16:26 buddyinfodr-xr-xr-x 5 root root 0 Apr 29 16:26 bus-r--r--r-- 1 root root 0 Apr 29 16:26 cgroups-r--r--r-- 1 root root 0 Apr 29 16:26 cmdline-r--r--r-- 1 root root 0 Apr 29 16:26 consoles-r--r--r-- 1 root root 0 Apr 29 16:26 cpuinfo-r--r--r-- 1 root root 0 Apr 29 16:26 crypto-r--r--r-- 1 root root 0 Apr 29 16:26 devices-r--r--r-- 1 root root 0 Apr 29 16:26 diskstats-r--r--r-- 1 root root 0 Apr 29 16:26 dmadr-xr-xr-x 2 root root 0 Apr 29 16:26 driver-r--r--r-- 1 root root 0 Apr 29 16:26 execdomains-r--r--r-- 1 root root 0 Apr 29 16:26 fb-r--r--r-- 1 root root 0 Apr 29 16:26 filesystemsdr-xr-xr-x 10 root root 0 Apr 29 16:26 fs-r--r--r-- 1 root root 0 Apr 29 16:26 interrupts-r--r--r-- 1 root root 0 Apr 29 16:26 iomem-r--r--r-- 1 root root 0 Apr 29 16:26 ioportsdr-xr-xr-x 32 root root 0 Apr 29 16:26 irq-r--r--r-- 1 root root 0 Apr 29 16:26 kallsyms-r-------- 1 root root 140737486262272 Apr 29 16:26 kcore
雖然這些文件大小為0,但是,我們卻可以使用cat、more或less命令查看其中的內容。例如,在上面的文件中,cmdline保存了操作系統的啟動參數。可以使用cat命令查看該文件中的內容以獲取操作系統的啟動參數:
root@host1:/proc# cat /proc/cmdlineBOOT_IMAGE=/boot/vmlinuz-3.2.73-amd64 root=/dev/vda1 ro console=tty0 console=ttyS0,115200 quiet
關於每一個文件的含義,可以使用下面的命令查看幫助信息:
# man proc
通過的上面的命令查看kcore文件的解釋,我們知道,/proc/kcore是物理內存的鏡像,它會顯示文件大小的,但是不佔用實際的磁碟空間,所以,看到該文件非常大,也不用擔心。kcore文件的大小等於已被使用的物理內存的大小加上4k,該文件可以使用gdb工具調試以查看內核中的數據結構。
proc目錄中包含了若干文件,以及多個名字是數字的目錄。proc目錄下的文件,保存的是整個系統的信息。名字是數字的目錄,保存的是進程的信息。目錄的名字正是進程的pid。因此,我們可以通過讀取proc目錄下有多少個以數字命名的目錄,來判斷當前系統中有多少進程。如下所示:
In [1]: import osIn [2]: pids = [ item for item in os.listdir(.) if item.isdigit() ]In [3]: len(pids)Out[3]: 158
proc目錄下常用文件介紹
proc目錄包含了許多的文件,每個文件保存了系統中某一部分內容。為了節省篇幅,我們僅介紹部分常用文件。
在編寫Linux的監控系統時,最基本的監控包括cpu、內存、磁碟和網路等信息。這些信息可以從下面幾個文件中獲得:
- /proc/loadavg 保存了系統負載的平均值,其前三列分別表示最近1分鐘、5分鐘及15分的平均負載。反映了當前系統的繁忙情況。
- /proc/meminfo 當前內存使用的統計信息,常由free命令使用;可以使用文件查看命令直接讀取此文件,其內容顯示為兩列,前者為統計屬性,後者為對應的值;
- /proc/diskstats 磁碟設備的磁碟I/O統計信息列表;
- /proc/net/dev 網路流入流出的統計信息,包括接收包的數量、發送包的數量,發送數據包時的錯誤和衝突情況等。
除了使用proc目錄獲取系統的監控信息以外,我們也會經常使用proc目錄查詢系統信息。例如,我們可以通過/proc/filesystem目錄查看當前系統中支持的文件系統:
# cat /proc/filesystems
通過/proc/cpuinfo文件查看cpu的詳細信息。例如,使用下面的命令可以查看邏輯cpu的個數:
# cat /proc/cpuinfo | grep processor
其他一些常用的proc文件包括:
- /proc/cmdline 在啟動時傳遞至內核的啟動參數,通常由grub啟動管理工具進行傳遞;
- /proc/devices 系統已經載入的所有塊設備和字元設備的信息;
- /proc/mounts 系統中當前掛載的所有文件系統;
- /proc/partitions 塊設備每個分區的主設備號(major)和次設備號(minor)等信息,同時包括每個分區所包含的塊(block)數目;
- /proc/uptime 系統上次啟動以來的運行時間;
- /proc/version 當前系統運行的內核版本號,在作者的Debian系統中,還會顯示系統安裝的gcc版本;
- /proc/vmstat 當前系統虛擬內存的統計數據。
進程目錄下常用文件介紹
proc目錄下有很多名字為數字的目錄,目錄的名稱與進程的pid一一對應(形如/proc[pid]),我們可以通過這些目錄查看進程相關的信息。顯然,目錄的名稱隨著進程的生命周期變化,當進程退出時,相應的目錄也就會消失。
進程目錄下也包含了較多的文件和目錄,其中,比較常用的有:
cmdline 與/proc/cmdline文件類似,保存了當前進程的啟動命令;
# cat cmdline udevd--daemon
cwd cwd是一個符號鏈接,指向進程的運行目錄;
exe exe也是一個軟鏈接,指向啟動進程的可執行文件,通過/proc/[pid]/exe可以啟動當前進程的一個拷貝;
environ 包含於進程相關聯的環境變數,變數名用大寫字母表示,其值用小寫字母表示;
# cat environ CONSOLE=/dev/consoleHOME=/init=/sbin/initrunlevel=SINIT_VERSION=sysvinit-2.88TERM=linuxBOOT_IMAGE=/boot/vmlinuz-3.2.73-amd64PATH=/sbin:/binRUNLEVEL=SPREVLEVEL=NSHELL=/bin/shPWD=/previous=Nrootmnt=/root
fd fd目錄包含了進程打開的每一個文件的文件描述符(file descriptor),這些文件描述符是指向實際文件的一個符號鏈接;
fd目錄下的文件,與文件一一對應,我們可以通過fd目錄下的文件個數,統計當前進程打開的文件句柄數。此外,也可以直接讀取文件的內容,就像讀取真實文件一樣。
/proc/334/fd# ls 0 1 10 2 3 4 5 6 7 8 9
limits 保存了進程使用資源的限制信息,包括軟限制、硬限制以及取值的單位;
# cat limits Max open files 1024 4096 files Max locked memory 65536 65536 bytes
task 該目錄下包含了當前進程所運行的每一個線程的相關信息,每個線程的相關信息文件均保存在一個由線程號(tid)命名的目錄中。
歡迎加入MySQL+Python+大數據+NoSQL技術交流QQ群(群號:306706593)。
推薦閱讀:
※Linux 伺服器有必要開啟 iptables 防火牆么?
※機器人程序設計之如何正確入門ROS | 硬創公開課(附視頻)
※怎樣才算有自主知識產權的操作系統?研發「自主知識產權」的操作系統對中國的社會和經濟有何意義?
※linux/unix socket編程並發時什麼時候用進程(fork),什麼時候用線程(池)?