Linux 內(nèi)核提供了一種通過 proc 文件系統(tǒng),在運(yùn)行時(shí)訪問內(nèi)核內(nèi)部數(shù)據(jù)結(jié)構(gòu)、改變內(nèi)核設(shè)置的機(jī)制。proc 文件系統(tǒng)是一個(gè)偽文件系統(tǒng),它只存在內(nèi)存當(dāng)中,而不占用外存空間。它以文件系統(tǒng)的方式為訪問系統(tǒng)內(nèi)核數(shù)據(jù)的操作提供接口。
用戶和應(yīng)用程序可以通過 proc 得到系統(tǒng)的信息,并可以改變內(nèi)核的某些參數(shù)。由于系統(tǒng)的信息,如進(jìn)程,是動態(tài)改變的,所以用戶或應(yīng)用程序讀取 proc 文件時(shí),proc 文件系統(tǒng)是動態(tài)從系統(tǒng)內(nèi)核讀出所需信息并提交的。
下面列出的這些文件或子文件夾,并不是都是在你的系統(tǒng)中存在,這取決于你的內(nèi)核配置和裝載的模塊。另外,在 proc 下還有三個(gè)很重要的目錄:net,scsi 和 sys。 sys 目錄是可寫的,可以通過它來訪問或修改內(nèi)核的參數(shù),而 net 和 scsi 則依賴于內(nèi)核配置。例如,如果系統(tǒng)不支持 scsi,則 scsi 目錄不存在。
除了以上介紹的這些,還有的是一些以數(shù)字命名的目錄,它們是進(jìn)程目錄。系統(tǒng)中當(dāng)前運(yùn)行的每一個(gè)進(jìn)程都有對應(yīng)的一個(gè)目錄在 proc 下,以進(jìn)程的 PID 號為目錄名,它們是讀取進(jìn)程信息的接口。而 self 目錄則是讀取進(jìn)程本身的信息接口,是一個(gè) link。
1./proc/[pid]/auxv
/proc/[pid]/auxv 包含傳遞給進(jìn)程的 ELF 解釋器信息,格式是每一項(xiàng)都是一個(gè) unsigned long長度的 ID 加上一個(gè) unsigned long 長度的值。最后一項(xiàng)以連續(xù)的兩個(gè) 0x00 開頭。
2. /proc/[pid]/cmdline
/proc/[pid]/cmdline 是一個(gè)只讀文件,包含進(jìn)程的完整命令行信息。如果該進(jìn)程已經(jīng)被交換出內(nèi)存或者這個(gè)進(jìn)程是 zombie 進(jìn)程,則這個(gè)文件沒有任何內(nèi)容。該文件以空字符 null 而不是換行符作為結(jié)束標(biāo)志。舉例如下:
$ ps aux|grep frps root 2406 0.1 0.1 54880 10524 ? Sl Dec11 21:30 frps -c ./frps.ini $ cat /proc/2406/cmdline frps-c./frps.ini
3./proc/[pid]/comm
/proc/[pid]/comm 包含進(jìn)程的命令名。舉例如下:
$ cat /proc/2406/comm frps 4./proc/[pid]/cwd
/proc/[pid]/cwd 是進(jìn)程當(dāng)前工作目錄的符號鏈接。舉例如下:
$ ls -lt /proc/2406/cwd lrwxrwxrwx 1 root root 0 Dec 12 20:39 /proc/2406/cwd -> /home/mike/frp_0.13.0_linux_amd64 5./proc/[pid]/environ
/proc/[pid]/environ 顯示進(jìn)程的環(huán)境變量。舉例如下:
$ strings /proc/2406/environ
SUPERVISOR_GROUP_NAME=ssh TERM=linux SUPERVISOR_SERVER_URL=unix:///var/run/supervisor.sock SUPERVISOR_PROCESS_NAME=ssh RUNLEVEL=2 UPSTART_EVENTS=runlevel PREVLEVEL=N PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin UPSTART_INSTANCE= UPSTART_JOB=rc SUPERVISOR_ENABLED=1 runlevel=2 PWD=/ previous=N 6./proc/[pid]/exe /proc/[pid]/exe 為實(shí)際運(yùn)行程序的符號鏈接。舉例如下: $ ls -lt /proc/2406/exe lrwxrwxrwx 1 root root 0 Dec 11 19:00 /proc/2406/exe -> /usr/bin/frps
7./proc/[pid]/fd
/proc/[pid]/fd 是一個(gè)目錄,包含進(jìn)程打開文件的情況。舉例如下:
$ ls -lt /proc/2406/fd lrwx------ 1 root root 64 Dec 24 09:39 77 -> socket:[44377722] lrwx------ 1 root root 64 Dec 17 15:07 47 -> socket:[29482617] lr-x------ 1 root root 64 Dec 12 20:18 0 -> pipe:[13282] l-wx------ 1 root root 64 Dec 12 20:18 1 -> pipe:[13283] lrwx------ 1 root root 64 Dec 12 20:18 10 -> socket:[12238218] lrwx------ 1 root root 64 Dec 12 20:18 4 -> anon_inode:[eventpoll] lrwx------ 1 root root 64 Dec 12 20:18 40 -> socket:[19378614] 目錄中的每一項(xiàng)都是一個(gè)符號鏈接,指向打開的文件,數(shù)字則代表文件描述符。
8./proc/[pid]/latency
/proc/[pid]/latency 顯示哪些代碼造成的延時(shí)比較大。如果要使用這個(gè)特性需要執(zhí)行:
$ echo 1 > /proc/sys/kernel/latencytop
舉例如下
$ cat /proc/2406/latency Latency Top version : v0.1 30667 10650491 4891 poll_schedule_timeout do_sys_poll SyS_poll system_call_fastpath 0x7f636573dc1d 8 105 44 futex_wait_queue_me futex_wait do_futex SyS_futex system_call_fastpath 0x7f6365a167bc
每一行前三個(gè)數(shù)字分別是后面代碼執(zhí)行的次數(shù)、總共執(zhí)行延遲時(shí)間(單位是微秒)和最長執(zhí)行延遲時(shí)間(單位是微秒)。后面則是代碼完整的調(diào)用棧。
9./proc/[pid]/root
/proc/[pid]/root 是進(jìn)程根目錄的符號鏈接。舉例如下:
$ ls -lt /proc/2406/root lrwxrwxrwx 1 root root 0 Dec 12 20:39 /proc/2406/root -> / 10./proc/[pid]/stack
/proc/[pid]/stack 示當(dāng)前進(jìn)程的內(nèi)核調(diào)用棧信息,只有內(nèi)核編譯時(shí)打開了 CONFIG_STACKTRACE 編譯選項(xiàng),才會生成這個(gè)文件。舉例如下:
$ cat /proc/2406/stack [<ffffffff810fa996>] futex_wait_queue_me+0xc6/0x130 [<ffffffff810fb05d>] futex_wait+0x17d/0x270 [<ffffffff810fd2d5>] do_futex+0xd5/0x520 [<ffffffff810fd791>] SyS_futex+0x71/0x150 [<ffffffff8180cc76>] entry_SYSCALL_64_fastpath+0x16/0x75 [<ffffffffffffffff>] 0xffffffffffffffff
11./proc/[pid]/statm
/proc/[pid]/statm 顯示進(jìn)程所占用內(nèi)存大小的統(tǒng)計(jì)信息。包含七個(gè)值,度量單位是 page(page大小可通過 getconf PAGESIZE 得到)。舉例如下:
$ cat /proc/2406/statm 13720 2617 493 746 0 12007 0
各個(gè)值含義:
a)進(jìn)程占用的總的內(nèi)存
b)進(jìn)程當(dāng)前時(shí)刻占用的物理內(nèi)存
c)同其它進(jìn)程共享的內(nèi)存
d)進(jìn)程的代碼段
e)共享庫(從2.6版本起,這個(gè)值為0)
f)進(jìn)程的堆棧
g)dirty pages(從2.6版本起,這個(gè)值為0)
12./proc/[pid]/status
/proc/[pid]/status 包含進(jìn)程的狀態(tài)信息。其很多內(nèi)容與 /proc/[pid]/stat 和 /proc/[pid]/statm 相同,但是卻是以一種更清晰地方式展現(xiàn)出來。
13./proc/[pid]/syscall
/proc/[pid]/syscall 顯示當(dāng)前進(jìn)程正在執(zhí)行的系統(tǒng)調(diào)用。舉例如下:
$ cat /proc/2406/syscall 202 0xab3730 0x0 0x0 0x0 0x0 0x0 0x7ffff7f6ec68 0x455bb3
第一個(gè)值是系統(tǒng)調(diào)用號(202代表poll),后面跟著 6 個(gè)系統(tǒng)調(diào)用的參數(shù)值(位于寄存器中),最后兩個(gè)值依次是堆棧指針和指令計(jì)數(shù)器的值。如果當(dāng)前進(jìn)程雖然阻塞,但阻塞函數(shù)并不是系統(tǒng)調(diào)用,則系統(tǒng)調(diào)用號的值為 -1,后面只有堆棧指針和指令計(jì)數(shù)器的值。如果進(jìn)程沒有阻塞,則這個(gè)文件只有一個(gè) running 的字符串。
內(nèi)核編譯時(shí)打開了 CONFIG_HAVE_ARCH_TRACEHOOK 編譯選項(xiàng),才會生成這個(gè)文件。
14./proc/[pid]/wchan
/proc/[pid]/wchan 顯示當(dāng)進(jìn)程 sleep 時(shí),kernel 當(dāng)前運(yùn)行的函數(shù)。舉例如下:
$ cat /proc/2406/wchan futex_wait_queue_meadmin