歡迎您光臨本站 註冊首頁

Linux 下的 /proc 目錄初探

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0

今天再來介紹一下Linux下的 /proc這個目錄.

/proc 在 Linux 中是一個比較奇妙的目錄,保存了當前系統所有的詳細信息,包括進程、文件系統、硬體…… 而且還可以通過 /proc 來即時修改系統中的某些參數.

你可能會認為,「文件」指的就是硬碟上保存的數據,要麼是文本,要麼就是二進位文件.而在 Linux 的世界中,所有的東西都可以通過文件來表示和管理,哪怕是硬體設備,也可以通過 /dev 下的設備文件來操作硬體設備.

/proc 就是這樣一種文件,它並不存在於硬碟上,每當系統啟動的時候,操作系統自動創建 /proc 下的內容,你可以查看這些文件的列表,但是你會發現大部分文件的大小都是 0 ,這並不奇怪,這些文件屬於「virtual files「,也就是說,當你讀取這些文件的時候,系統內核為你即時生成文件中的內容.

/proc 下的信息包括了有關硬體、進程、系統的詳細信息,先看看 /proc 下大致都有啥吧:

localhost ~ # ls /proc
1 143 19218 28326 28357 28406 5630 5784 5807 79 924 diskstats interrupts locks pagetypeinfo timer_list
1013 144 19223 28327 28377 28407 5713 5785 5808 814 asound dma iomem meminfo partitions tty
11079 18990 2 28329 28382 28796

5714 5786 5809 816 buddyinfo driver ioports misc self uptime
11086 19060 25659 28332 28385 3 5718 5787 5861 85 bus execdomains irq modules slabinfo version
11108 19068 28300 28334 28397 3454 5750 5798 71 88 cmdline fb kallsyms mounts stat vmstat
139 19070 28316 28338 28400 4 5781 5800 737 882 config.gz filesystems kcore mtd swaps zoneinfo
141 19174 28317 28342 28403 5 5782 5805 74 883 cpuinfo fs kmsg mtrr sys
142 19178 28322

28347 28404 5059 5783 5806 78 893 devices ide loadavg net sysvipc

可以看到,除了一些文件之外,更多的是一堆以數字為名稱的目錄,每個目錄代表了系統中的一個進程,目錄下是有關這個進程的詳細信息,這個等下我們再說. /proc 下還有一個 self 文件,實際上是一個連接,指向了當前運行中的進程目錄.

我們看看 /proc 目錄下一些非常有用的文件,查看這些文件的內容很簡單,用 cat 命令就可以了~

/proc/cpuinfo

localhost ~ # cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 15
model : 2
model name : Intel(R) Pentium(R) 4 CPU 2.40GHz
stepping : 7
cpu MHz : 2394.017
cache size : 512 KB
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 2
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe pebs bts sync_rdtsc cid xtpr
bogomips : 4792.93
clflush size : 64

/proc/cpuinfo 即是當前系統 cpu 的詳細信息,從型號到支持的特性,如果你是多核 cpu 的話,會看到多個這樣的輸出.檢測 cpu 的程序,也是通過 /proc/cpuinfo 來得到當前 cpu 的詳細信息的.

/proc/meminfo

localhost ~ #

cat /proc/meminfo
MemTotal: 514624 kB
MemFree: 10144 kB
Buffers: 20248 kB
Cached: 156248 kB
SwapCached: 60 kB
Active: 387864 kB
Inactive: 79612 kB
SwapTotal: 1052216 kB
SwapFree: 1051740 kB
Dirty: 8 kB
Writeback: 0 kB
AnonPages: 290940 kB
Mapped: 66216 kB
Slab: 25404 kB
SReclaimable: 16872 kB
SUnreclaim: 8532 kB
PageTables: 2152 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
CommitLimit: 1309528 kB
Committed_AS: 801488 kB
VmallocTotal: 515808 kB
VmallocUsed: 48176 kB
VmallocChunk: 463580 kB

/proc/meminfo 是當前系統內存的詳細信息,當然,隨著系統的運行,這些信息也會隨時變化.像 top、free 這些可以查看當前系統內存信息的程序,就是通過讀取 /proc/meminfo 來實現的.

/proc/version

localhost ~ # cat /proc/version
Linux version 2.6.24-gentoo-r2 (root@localhost) (gcc version 4.2

.2 (Gentoo 4.2.2 p1.0)) #1 Wed Feb 13 22:18:22 UTC 2008

/proc/version 是當前系統的版本信息,uname 這個命令,就是通過它來得到內核版本和系統版本的.

/proc/filesystems

localhost ~ # cat /proc/filesystems
nodev sysfs
nodev rootfs
nodev bdev
nodev proc
nodev sockfs
nodev usbfs
nodev pipefs
nodev anon_inodefs
nodev futexfs
nodev tmpfs
nodev inotifyfs
nodev devpts
reiserfs
ext3
ext2
nodev ramfs
msdos
vfat
iso9660
nodev cifs
ntfs
udf

/proc/filesystems 為當前系統支持的文件系統列表,你可以在程序中讀取這個文件,以獲得當前系統對文件系統的支持信息.

上面這幾個只是比較常用的,實際上 /proc 下的信息相當豐富,很多文件都可以 cat 一下看看,比如:

* /proc/apm: APM 高級電源管理信息.
* /proc/acpi: 目錄下為 ACPI 的詳細信息. 比方說, 你想知道你的筆記本電腦是否連接了電源, 你可以 cat /proc/acpi/ac_adapter/AC/state 看看結果是 "on line" 還是 "off line" .
* /proc/cmdline: 顯示內核的啟動參數,一般就是你 grub 中傳入內核的那些參數,比如我的就是: root=/dev/sda9 video=uvesafb:1680x1050-32,mtrr:3,ywrap
* /proc/loadav: 顯示系統的負載,w、top 這類程序也是從此得到系統負載信息.
* /proc/uptime: 系統自啟動來所經歷的秒數,uptime 程序就是從此計算出系統啟動后經歷的時間的.
* /proc/devices: 系統中所有可用的字元和塊設備.
* /proc/ioports: IO 埠信息.
* /proc/dma: 當前可用的 DMA 通道.
* /proc/mounts: 系統當前的掛載信息.

除此之外,還有一些文件和硬體相關,比如 /proc/interrupts 為終端信息,/proc/irq 為 IRQ 信息,還有 /proc/pci、/proc/bus 等等.



現在我們來看看開始提到的那些數字目錄,也就是和進程相關的目錄.

如前面所說,每個數字目錄都代表了一個正在運行的進程,目錄的數字名就是進程的 ID,每當一個新進程啟動,一個新的目錄就會被創建,同理進程結束的時候,相應的目錄也會消失.

讓我們看看進程目錄下面都有啥:

localhost / # ls /proc/11108
auxv cmdline cwd exe fdinfo maps mounts oom_adj root stat status wchan
clear_refs coredump_filter environ fd limits mem mountstats oom_score smaps statm task

隨便挑選了一個名稱為 11108 的目錄,在我的機子上對應的進程是 firefox-bin,讓我們看看目錄下這些文件都是啥:

* cmdline: 啟動進程的命令和參數.
* cwd: 指向進程當前目錄的一個連接.
* environ: 進程所有的環境變數.
* fd: 進程所有打開的文件描述符,目錄下是一個個以數字為名稱的連接,指向了進程當前正在使用的文件.
* maps, statm, mem: 進程的內存信息.
* stat, status: 進程的狀態信息,比如查看 /proc/status 中是否含有 「Zombie」字樣,來查看殭屍進程.

/proc/sys

/proc/sys 目錄下不僅提供了系統某些設置信息,你還可以修改這些文件來在運行中改變系統的參數,比如,你想讓別人 ping 不到你,只要:

# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

這樣就可以讓系統忽略所有的 ICMP 回應,別人就 ping 不到你了.

/proc/sys 下的可配置的選項很多,主要有 6 類: debug、dev、fs、kernel、net、vm,只要文件屬性是可讀寫的,一般都對應了系統某個可以修改的參數.

不過系統重啟之後參數就恢復默認值了,其實有專門的工具來修改這些參數,那就是 sysctl 和 /etc/sysctl.conf 這個配置文件,不過這不是本文的內容,感興趣的就去搜一下吧.

如上所述,/proc 是一個強大的特殊目錄,其中的文件提供了非常詳細的系統信息,很多常用的程序就是從此得到系統各個方面的信息的,在你寫的程序和腳本中,也可以通過 /proc 方便的獲得一些系統參數,甚至修改系統的某些參數,本文只是 /proc 的一個簡要的介紹,更詳細的內容留給各位自己去探索吧.

修改自: http://www.linux.com/feature/126718


[火星人 ] Linux 下的 /proc 目錄初探已經有438次圍觀

http://coctec.com/docs/linux/show-post-58052.html