1. 程式人生 > 實用技巧 >linux中proc目錄

linux中proc目錄

看程式碼的時候無意進到了這個裡面

看到這些東西我直接懵逼,這都是啥跟啥

使用一下ps,看一下當前有什麼程序

5771 有點眼熟,上面似乎也有5771,進去看看

這裡又是啥跟啥,裡面有個fd有點眼熟,這不是檔案描述符與嗎,再進去看看

再一次懵逼。

現在開啟百度,搜尋一下。。。

首先 proc 這個目錄是幹什麼的

Linux系統上的/proc目錄是一種檔案系統,即proc檔案系統。與其它常見的檔案系統不同的是,/proc是一種偽檔案系統(也即虛擬檔案系統),儲存的是當前核心執行狀態的一系列特殊檔案,使用者可以通過這些檔案檢視有關係統硬體及當前正在執行程序的資訊,甚至可以通過更改其中某些檔案來改變核心的執行狀態。


基於/proc檔案系統如上所述的特殊性,其內的檔案也常被稱作虛擬檔案,並具有一些獨特的特點。例如,其中有些檔案雖然使用檢視命令檢視時會返回大量資訊,但檔案本身的大小卻會顯示為0位元組。此外,這些特殊檔案中大多數檔案的時間及日期屬性通常為當前系統時間和日期,這跟它們隨時會被重新整理(儲存於RAM中)有關。

為了檢視及使用上的方便,這些檔案通常會按照相關性進行分類儲存於不同的目錄甚至子目錄中,如/proc/scsi目錄中儲存的就是當前系統上所有SCSI裝置的相關資訊,/proc/N中儲存的則是系統當前正在執行的程序的相關資訊,其中N為正在執行的程序(可以想象得到,在某程序結束後其相關目錄則會消失)。

大多數虛擬檔案可以使用檔案檢視命令如cat、more或者less
進行檢視,有些檔案資訊表述的內容可以一目瞭然,但也有檔案的資訊卻不怎麼具有可讀性。不過,這些可讀性較差的檔案在使用一些命令如apm、free、lspci或top檢視時卻可以有著不錯的表現。

那麼這個目錄裡面都是啥東西呢?

/proc目錄中包含許多以數字命名的子目錄,這些數字表示系統當前正在執行程序的程序號,裡面包含對應程序相關的多個資訊檔案。

也就是這堆數字,其實都是程序號

那麼綠色的這些檔案都是幹嘛的呢?

2.1、/proc/apm
高階電源管理(APM)版本資訊及電池相關狀態資訊,通常由apm命令使用;

2.2、/proc/buddyinfo
用於診斷記憶體碎片問題的相關資訊檔案;

2.3、/proc/cmdline

在啟動時傳遞至核心的相關引數資訊,這些資訊通常由lilo或grub等啟動管理工具進行傳遞;

[root@rhel5 ~]# more /proc/cmdline
ro root=/dev/VolGroup00/LogVol00 rhgb quiet


2.4、/proc/cpuinfo
處理器的相關資訊的檔案;

2.5、/proc/crypto
系統上已安裝的核心使用的密碼演算法及每個演算法的詳細資訊列表;

[root@rhel5 ~]# more /proc/crypto
name : crc32c
driver : crc32c-generic
module : kernel
priority : 0
type : digest
blocksize : 32
digestsize : 4
…………


2.6、/proc/devices
系統已經載入的所有塊裝置和字元裝置的資訊,包含主裝置號和裝置組(與主裝置號對應的裝置型別)名;

[root@rhel5 ~]# more /proc/devices
Character devices:
1 mem
4 /dev/vc/0
4 tty
4 ttyS
…………

Block devices:
1 ramdisk
2 fd
8 sd
…………


2.7、/proc/diskstats
每塊磁碟裝置的磁碟I/O統計資訊列表;(核心2.5.69以後的版本支援此功能)

2.8、/proc/dma
每個正在使用且註冊的ISA DMA通道的資訊列表;

[root@rhel5 ~]# more /proc/dma
2: floppy
4: cascade


2.9、/proc/execdomains
核心當前支援的執行域(每種作業系統獨特“個性”)資訊列表;

[root@rhel5 ~]# more /proc/execdomains
0-0 Linux [kernel]


2.10、/proc/fb
幀緩衝裝置列表檔案,包含幀緩衝裝置的裝置號和相關驅動資訊;

2.11、/proc/filesystems
當前被核心支援的檔案系統型別列表檔案,被標示為nodev的檔案系統表示不需要塊裝置的支援;通常mount一個裝置時,如果沒有指定檔案系統型別將通過此檔案來決定其所需檔案系統的型別;

[root@rhel5 ~]# more /proc/filesystems
nodev sysfs
nodev rootfs
nodev proc
iso9660
ext3
…………
…………


2.12、/proc/interrupts
X86或X86_64體系架構系統上每個IRQ相關的中斷號列表;多路處理器平臺上每個CPU對於每個I/O裝置均有自己的中斷號;

[root@rhel5 ~]# more /proc/interrupts
CPU0
0: 1305421 IO-APIC-edgetimer
1: 61 IO-APIC-edgei8042
185: 1068 IO-APIC-leveleth0
…………


2.13、/proc/iomem
每個物理裝置上的記憶體(RAM或者ROM)在系統記憶體中的對映資訊;

[root@rhel5 ~]# more /proc/iomem
00000000-0009f7ff : System RAM
0009f800-0009ffff : reserved
000a0000-000bffff : Video RAM area
000c0000-000c7fff : Video ROM
…………


2.14、/proc/ioports
當前正在使用且已經註冊過的與物理裝置進行通訊的輸入-輸出埠範圍資訊列表;如下面所示,第一列表示註冊的I/O埠範圍,其後表示相關的裝置;

[root@rhel5 ~]# less /proc/ioports
0000-001f : dma1
0020-0021 : pic1
0040-0043 : timer0
0050-0053 : timer1
0060-006f : keyboard
…………


2.15、/proc/kallsyms
模組管理工具用來動態連結或繫結可裝載模組的符號定義,由核心輸出;(核心2.5.71以後的版本支援此功能);通常這個檔案中的資訊量相當大;

[root@rhel5 ~]# more /proc/kallsyms
c04011f0 T _stext
c04011f0 t run_init_process
c04011f0 T stext
…………


2.16、/proc/kcore
系統使用的實體記憶體,以ELF核心檔案(core file)格式儲存,其檔案大小為已使用的實體記憶體(RAM)加上4KB;這個檔案用來檢查核心資料結構的當前狀態,因此,通常由GBD通常除錯工具使用,但不能使用檔案檢視命令開啟此檔案;

2.17、/proc/kmsg
此檔案用來儲存由核心輸出的資訊,通常由/sbin/klogd或/bin/dmsg等程式使用,不要試圖使用檢視命令開啟此檔案;

2.18、/proc/loadavg
儲存關於CPU和磁碟I/O的負載平均值,其前三列分別表示每1秒鐘、每5秒鐘及每15秒的負載平均值,類似於uptime命令輸出的相關資訊;第四列是由斜線隔開的兩個數值,前者表示當前正由核心排程的實體(程序和執行緒)的數目,後者表示系統當前存活的核心排程實體的數目;第五列表示此檔案被檢視前最近一個由核心建立的程序的PID;

[root@rhel5 ~]# more /proc/loadavg
0.45 0.12 0.04 4/125 5549

[root@rhel5 ~]# uptime
06:00:54 up1:06,3 users,load average: 0.45, 0.12, 0.04


2.19、/proc/locks
儲存當前由核心鎖定的檔案的相關資訊,包含核心內部的除錯資料;每個鎖定佔據一行,且具有一個惟一的編號;如下輸出資訊中每行的第二列表示當前鎖定使用的鎖定類別,POSIX表示目前較新型別的檔案鎖,由lockf系統呼叫產生,FLOCK是傳統的UNIX檔案鎖,由flock系統呼叫產生;第三列也通常由兩種型別,ADVISORY表示不允許其他使用者鎖定此檔案,但允許讀取,MANDATORY表示此檔案鎖定期間不允許其他使用者任何形式的訪問;

[root@rhel5 ~]# more /proc/locks
1: POSIXADVISORYWRITE 4904 fd:00:4325393 0 EOF
2: POSIXADVISORYWRITE 4550 fd:00:2066539 0 EOF
3: FLOCKADVISORYWRITE 4497 fd:00:2066533 0 EOF


2.20、/proc/mdstat
儲存RAID相關的多塊磁碟的當前狀態資訊,在沒有使用RAID機器上,其顯示為如下狀態:

[root@rhel5 ~]# less /proc/mdstat
Personalities :
unused devices: <none>


2.21、/proc/meminfo
系統中關於當前記憶體的利用狀況等的資訊,常由free命令使用;可以使用檔案檢視命令直接讀取此檔案,其內容顯示為兩列,前者為統計屬性,後者為對應的值;

[root@rhel5 ~]# less /proc/meminfo
MemTotal: 515492 kB
MemFree: 8452 kB
Buffers: 19724 kB
Cached: 376400 kB
SwapCached: 4 kB
…………


2.22、/proc/mounts
在核心2.4.29版本以前,此檔案的內容為系統當前掛載的所有檔案系統,在2.4.19以後的核心中引進了每個程序使用獨立掛載名稱空間的方式,此檔案則隨之變成了指向/proc/self/mounts(每個程序自身掛載名稱空間中的所有掛載點列表)檔案的符號連結;/proc/self是一個獨特的目錄,後文中會對此目錄進行介紹;

[root@rhel5 ~]# ll /proc |grep mounts
lrwxrwxrwx1 root root 11 Feb8 06:43 mounts -> self/mounts


如下所示,其中第一列表示掛載的裝置,第二列表示在當前目錄樹中的掛載點,第三點表示當前檔案系統的型別,第四列表示掛載屬性(ro或者rw),第五列和第六列用來匹配/etc/mtab檔案中的轉儲(dump)屬性;


[root@rhel5 ~]# more /proc/mounts
rootfs / rootfs rw 0 0
/dev/root / ext3 rw,data=ordered 0 0
/dev /dev tmpfs rw 0 0
/proc /proc proc rw 0 0
/sys /sys sysfs rw 0 0
/proc/bus/usb /proc/bus/usb usbfs rw 0 0
…………


2.23、/proc/modules
當前裝入核心的所有模組名稱列表,可以由lsmod命令使用,也可以直接檢視;如下所示,其中第一列表示模組名,第二列表示此模組佔用記憶體空間大小,第三列表示此模組有多少例項被裝入,第四列表示此模組依賴於其它哪些模組,第五列表示此模組的裝載狀態(Live:已經裝入;Loading:正在裝入;Unloading:正在解除安裝),第六列表示此模組在核心記憶體(kernel memory)中的偏移量;

[root@rhel5 ~]# more /proc/modules
autofs4 24517 2 - Live 0xe09f7000
hidp 23105 2 - Live 0xe0a06000
rfcomm 42457 0 - Live 0xe0ab3000
l2cap 29505 10 hidp,rfcomm, Live 0xe0aaa000
…………


2.24、/proc/partitions
塊裝置每個分割槽的主裝置號(major)和次裝置號(minor)等資訊,同時包括每個分割槽所包含的塊(block)數目(如下面輸出中第三列所示);

[root@rhel5 ~]# more /proc/partitions
major minor#blocksname

8 0 20971520 sda
8 1 104391 sda1
8 2 6907950 sda2
8 3 5630782 sda3
8 4 1 sda4
8 5 3582463 sda5


2.25、/proc/pci
核心初始化時發現的所有PCI裝置及其配置資訊列表,其配置資訊多為某PCI裝置相關IRQ資訊,可讀性不高,可以用“/sbin/lspci –vb”命令獲得較易理解的相關資訊;在2.6核心以後,此檔案已為/proc/bus/pci目錄及其下的檔案代替;

2.26、/proc/slabinfo
在核心中頻繁使用的物件(如inode、dentry等)都有自己的cache,即slab pool,而/proc/slabinfo檔案列出了這些物件相關slap的資訊;詳情可以參見核心文件中slapinfo的手冊頁;

[root@rhel5 ~]# more /proc/slabinfo
slabinfo - version: 2.1
# name <active_objs> <num_objs> <objsize> <objperslab> <pagesperslab> : tunables <limit> <batchcount> <sharedfactor> : slabdata <ac
tive_slabs> <num_slabs> <sharedavail>
rpc_buffers 8 8 2048 2 1 : tunables 24 12 8 : slabdata 4 4 0
rpc_tasks 8 20 192 20 1 : tunables120 60 8 : slabdata 1 1 0
rpc_inode_cache 6 9 448 9 1 : tunables 54 27 8 : slabdata 1 1 0
…………
…………
…………


2.27、/proc/stat
實時追蹤自系統上次啟動以來的多種統計資訊;如下所示,其中,
“cpu”行後的八個值分別表示以1/100(jiffies)秒為單位的統計值(包括系統運行於使用者模式、低優先順序使用者模式,運系統模式、空閒模式、I/O等待模式的時間等);
“intr”行給出中斷的資訊,第一個為自系統啟動以來,發生的所有的中斷的次數;然後每個數對應一個特定的中斷自系統啟動以來所發生的次數;
“ctxt”給出了自系統啟動以來CPU發生的上下文交換的次數。
“btime”給出了從系統啟動到現在為止的時間,單位為秒;
“processes (total_forks) 自系統啟動以來所建立的任務的個數目;
“procs_running”:當前執行佇列的任務的數目;
“procs_blocked”:當前被阻塞的任務的數目;

[root@rhel5 ~]# more /proc/stat
cpu2751 26 5771 266413 2555 99 411 0
cpu0 2751 26 5771 266413 2555 99 411 0
intr 2810179 2780489 67 0 3 3 0 5 0 1 0 0 0 1707 0 0 9620 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5504 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12781 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ctxt 427300
btime 1234084100
processes 3491
procs_running 1
procs_blocked 0


2.28、/proc/swaps
當前系統上的交換分割槽及其空間利用資訊,如果有多個交換分割槽的話,則會每個交換分割槽的資訊分別儲存於/proc/swap目錄中的單獨檔案中,而其優先順序數字越低,被使用到的可能性越大;下面是作者系統中只有一個交換分割槽時的輸出資訊;

[root@rhel5 ~]# more /proc/swaps
Filename Type Size Used Priority
/dev/sda8 partition 6425600 -1


2.29、/proc/uptime
系統上次啟動以來的執行時間,如下所示,其第一個數字表示系統執行時間,第二個數字表示系統空閒時間,單位是秒;

[root@rhel5 ~]# more /proc/uptime
3809.86 3714.13


2.30、/proc/version
當前系統執行的核心版本號,在作者的RHEL5.3上還會顯示系統安裝的gcc版本,如下所示;

[root@rhel5 ~]# more /proc/version
Linux version 2.6.18-128.el5 ([email protected]) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-44)) #1 SMP Wed Dec 17 11:42:39 EST 2008


2.31、/proc/vmstat
當前系統虛擬記憶體的多種統計資料,資訊量可能會比較大,這因系統而有所不同,可讀性較好;下面為作者機器上輸出資訊的一個片段;(2.6以後的核心支援此檔案)

[root@rhel5 ~]# more /proc/vmstat
nr_anon_pages 22270
nr_mapped 8542
nr_file_pages 47706
nr_slab 4720
nr_page_table_pages 897
nr_dirty 21
nr_writeback 0
…………


2.32、/proc/zoneinfo
記憶體區域(zone)的詳細資訊列表,資訊量較大,下面列出的是一個輸出片段:

[root@rhel5 ~]# more /proc/zoneinfo
Node 0, zone DMA
pages free 1208
min 28
low 35
high 42
active 439
inactive 1139
scanned0 (a: 7 i: 30)
spanned4096
present4096
nr_anon_pages 192
nr_mapped 141
nr_file_pages 1385
nr_slab 253
nr_page_table_pages 2
nr_dirty 523
nr_writeback 0
nr_unstable0
nr_bounce 0
protection: (0, 0, 296, 296)
pagesets
all_unreclaimable: 0
prev_priority: 12
start_pfn: 0
…………

剛才我們進入到了其中一個程序裡面,看到了這個畫面

下面是這些檔案的作用:

cmdline — 啟動當前程序的完整命令,但殭屍程序目錄中的此檔案不包含任何資訊; 
cwd — 指向當前程序執行目錄的一個符號連結; 
environ — 當前程序的環境變數列表,彼此間用空字元(NULL)隔開;變數用大寫字母表示,其值用小寫字母表示; 
exe — 指向啟動當前程序的可執行檔案(完整路徑)的符號連結,通過/proc/N/exe可以啟動當前程序的一個拷貝;
fd — 這是個目錄,包含當前程序開啟的每一個檔案的檔案描述符(file descriptor),這些檔案描述符是指向實際檔案的一個符號連結;
limits — 當前程序所使用的每一個受限資源的軟限制、硬限制和管理單元;此檔案僅可由實際啟動當前程序的UID使用者讀取;(2.6.24以後的核心版本支援此功能);
maps — 當前程序關聯到的每個可執行檔案和庫檔案在記憶體中的對映區域及其訪問許可權所組成的列表; 
mem — 當前程序所佔用的記憶體空間,由open、read和lseek等系統呼叫使用,不能被使用者讀取;
root — 指向當前程序執行根目錄的符號連結;在Unix和Linux系統上,通常採用chroot命令使每個程序運行於獨立的根目錄; 
stat — 當前程序的狀態資訊,包含一系統格式化後的資料列,可讀性差,通常由ps命令使用;
statm — 當前程序佔用記憶體的狀態資訊,通常以“頁面”(page)表示; 
status — 與stat所提供資訊類似,但可讀性較好,如下所示,每行表示一個屬性資訊;其詳細介紹請參見 proc的man手冊頁;
task — 目錄檔案,包含由當前程序所執行的每一個執行緒的相關資訊,每個執行緒的相關資訊檔案均儲存在一個由執行緒號(tid)命名的目錄中,這類似於其內容類似於每個程序目錄中的內容;(核心2.6版本以後支援此功能)