Linux /proc/$pid部分內容詳解【轉】
- 2019 年 10 月 8 日
- 筆記
轉自:https://www.cnblogs.com/likui360/p/6181927.html
auxv
/proc/[pid]/auxv
包含傳遞給進程的ELF
解釋器信息,格式是每一項都是一個unsigned long
長度的ID
加上一個unsigned long
長度的值。最後一項以連續的兩個0x00
開頭。舉例如下:
# hexdump -x /proc/2948/auxv 0000000 0021 0000 0000 0000 0000 1a82 7ffd 0000 0000010 0010 0000 0000 0000 dbf5 1fc9 0000 0000 0000020 0006 0000 0000 0000 1000 0000 0000 0000 0000030 0011 0000 0000 0000 0064 0000 0000 0000 0000040 0003 0000 0000 0000 2040 4326 7f4a 0000 0000050 0004 0000 0000 0000 0038 0000 0000 0000 0000060 0005 0000 0000 0000 0009 0000 0000 0000 0000070 0007 0000 0000 0000 f000 4303 7f4a 0000 0000080 0008 0000 0000 0000 0000 0000 0000 0000 0000090 0009 0000 0000 0000 8e67 4327 7f4a 0000 00000a0 000b 0000 0000 0000 0000 0000 0000 0000 00000b0 000c 0000 0000 0000 0000 0000 0000 0000 00000c0 000d 0000 0000 0000 0000 0000 0000 0000 00000d0 000e 0000 0000 0000 0000 0000 0000 0000 00000e0 0017 0000 0000 0000 0000 0000 0000 0000 00000f0 0019 0000 0000 0000 3de9 1a80 7ffd 0000 0000100 001f 0000 0000 0000 4fe5 1a80 7ffd 0000 0000110 000f 0000 0000 0000 3df9 1a80 7ffd 0000 0000120 0000 0000 0000 0000 0000 0000 0000 0000 0000130
解析這個文件可以參考這段代碼。
cmdline
/proc/[pid]/cmdline
是一個只讀文件,包含進程的完整命令行信息。如果這個進程是zombie
進程,則這個文件沒有任何內容。舉例如下:
# ps -ef | grep 2948 root 2948 1 0 Nov05 ? 00:00:04 /usr/sbin/libvirtd --listen # cat /proc/2948/cmdline /usr/sbin/libvirtd--listen
comm
/proc/[pid]/comm
包含進程的命令名。舉例如下:
# cat /proc/2948/comm libvirtd
cwd
/proc/[pid]/cwd
是進程當前工作目錄的符號鏈接。舉例如下:
# ls -lt /proc/2948/cwd lrwxrwxrwx 1 root root 0 Nov 9 12:14 /proc/2948/cwd -> /
environ
/proc/[pid]/environ
顯示進程的環境變量。舉例如下:
# strings /proc/2948/environ LANG=POSIX LC_CTYPE=en_US.UTF-8 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin NOTIFY_SOCKET=@/org/freedesktop/systemd1/notify LIBVIRTD_CONFIG=/etc/libvirt/libvirtd.conf LIBVIRTD_ARGS=--listen LIBVIRTD_NOFILES_LIMIT=2048
exe
/proc/[pid]/exe
為實際運行程序的符號鏈接。舉例如下:
# ls -lt /proc/2948/exe lrwxrwxrwx 1 root root 0 Nov 5 13:04 /proc/2948/exe -> /usr/sbin/libvirtd
fd
/proc/[pid]/fd
是一個目錄,包含進程打開文件的情況。舉例如下:
# ls -lt /proc/3801/fd total 0 lrwx------. 1 root root 64 Apr 18 16:51 0 -> socket:[37445] lrwx------. 1 root root 64 Apr 18 16:51 1 -> socket:[37446] lrwx------. 1 root root 64 Apr 18 16:51 10 -> socket:[31729] lrwx------. 1 root root 64 Apr 18 16:51 11 -> socket:[34562] lrwx------. 1 root root 64 Apr 18 16:51 12 -> socket:[39978] lrwx------. 1 root root 64 Apr 18 16:51 13 -> socket:[34574] lrwx------. 1 root root 64 Apr 18 16:51 14 -> socket:[39137] lrwx------. 1 root root 64 Apr 18 16:51 15 -> socket:[39208] lrwx------. 1 root root 64 Apr 18 16:51 16 -> socket:[39221] lrwx------. 1 root root 64 Apr 18 16:51 17 -> socket:[41080] lrwx------. 1 root root 64 Apr 18 16:51 18 -> socket:[40014] lrwx------. 1 root root 64 Apr 18 16:51 19 -> socket:[34617] lrwx------. 1 root root 64 Apr 18 16:51 20 -> socket:[34620] lrwx------. 1 root root 64 Apr 18 16:51 23 -> socket:[42357] lr-x------. 1 root root 64 Apr 18 16:51 3 -> /dev/urandom lrwx------. 1 root root 64 Apr 18 16:51 4 -> socket:[37468] lrwx------. 1 root root 64 Apr 18 16:51 5 -> socket:[37471] lrwx------. 1 root root 64 Apr 18 16:51 6 -> socket:[289532] lrwx------. 1 root root 64 Apr 18 16:51 7 -> socket:[31728] lrwx------. 1 root root 64 Apr 18 16:51 8 -> socket:[37450] lrwx------. 1 root root 64 Apr 18 16:51 9 -> socket:[37451] l-wx------. 1 root root 64 Apr 13 16:35 2 -> /root/.vnc/localhost.localdomain:1.log
目錄中的每一項都是一個符號鏈接,指向打開的文件,數字則代表文件描述符。
latency
/proc/[pid]/latency
顯示哪些代碼造成的延時比較大(使用這個feature
,需要執行「echo 1 > /proc/sys/kernel/latencytop
」)。舉例如下:
# cat /proc/2948/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
每一行前三個數字分別是後面代碼執行的次數,總共執行延遲時間(單位是微秒)和最長執行延遲時間(單位是微秒),後面則是代碼完整的調用棧。
limits
/proc/[pid]/limits
顯示當前進程的資源限制。舉例如下:
# cat /proc/2948/limits Limit Soft Limit Hard Limit Units Max cpu time unlimited unlimited seconds Max file size unlimited unlimited bytes Max data size unlimited unlimited bytes Max stack size 8388608 unlimited bytes Max core file size 0 unlimited bytes Max resident set unlimited unlimited bytes Max processes 6409 6409 processes Max open files 1024 4096 files Max locked memory 65536 65536 bytes Max address space unlimited unlimited bytes Max file locks unlimited unlimited locks Max pending signals 6409 6409 signals Max msgqueue size 819200 819200 bytes Max nice priority 0 0 Max realtime priority 0 0 Max realtime timeout unlimited unlimited us
Soft Limit
表示kernel
設置給資源的值,Hard Limit
表示Soft Limit
的上限,而Units
則為計量單元。
maps
/proc/[pid]/maps
顯示進程的內存區域映射信息。舉例如下:
# cat /proc/2948/maps ...... address perms offset dev inode pathname 7f4a2e2ad000-7f4a2e2ae000 rw-p 00006000 08:14 6505977 /usr/lib64/sasl2/libsasldb.so.3.0.0 7f4a2e2ae000-7f4a2e2af000 ---p 00000000 00:00 0 7f4a2e2af000-7f4a2eaaf000 rw-p 00000000 00:00 0 [stack:94671] 7f4a2eaaf000-7f4a2eab0000 ---p 00000000 00:00 0 7f4a2eab0000-7f4a2f2b0000 rw-p 00000000 00:00 0 [stack:94670] ...... 7f4a434d0000-7f4a434d5000 rw-p 0006e000 08:14 4292988 /usr/sbin/libvirtd 7f4a4520a000-7f4a452f7000 rw-p 00000000 00:00 0 [heap] 7ffd1a7e4000-7ffd1a805000 rw-p 00000000 00:00 0 [stack] 7ffd1a820000-7ffd1a821000 r-xp 00000000 00:00 0 [vdso] ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
其中注意的一點是[stack:<tid>]
是線程的堆棧信息,對應於/proc/[pid]/task/[tid]/
路徑。
root
/proc/[pid]/root
是進程根目錄的符號鏈接。舉例如下:
# ls -lt /proc/2948/root lrwxrwxrwx 1 root root 0 Nov 9 12:14 /proc/2948/root -> /
stack
/proc/[pid]/stack
顯示當前進程的內核調用棧信息,只有內核編譯時打開了CONFIG_STACKTRACE
編譯選項,才會生成這個文件。舉例如下:
# cat /proc/2948/stack [<ffffffff80168375>] poll_schedule_timeout+0x45/0x60 [<ffffffff8016994d>] do_sys_poll+0x49d/0x550 [<ffffffff80169abd>] SyS_poll+0x5d/0xf0 [<ffffffff804c16e7>] system_call_fastpath+0x16/0x1b [<00007f4a41ff2c1d>] 0x7f4a41ff2c1d [<ffffffffffffffff>] 0xffffffffffffffff
statm
/proc/[pid]/statm
顯示進程所佔用內存大小的統計信息,包含七個值,度量單位是page
(page
大小可通過getconf PAGESIZE
得到)。舉例如下:
# cat /proc/2948/statm 72362 12945 4876 569 0 24665 0
各個值含義: a)進程佔用的總的內存; b)進程當前時刻佔用的物理內存; c)同其它進程共享的內存; d)進程的代碼段; e)共享庫(從2.6
版本起,這個值為0
); f)進程的堆棧; g)dirty pages
(從2.6
版本起,這個值為0
)。
syscall
/proc/[pid]/syscall
顯示當前進程正在執行的系統調用。舉例如下:
# cat /proc/2948/syscall 7 0x7f4a452cbe70 0xb 0x1388 0xffffffffffdff000 0x7f4a4274a750 0x0 0x7ffd1a8033f0 0x7f4a41ff2c1d
第一個值是系統調用號(7
代表poll
),後面跟着6
個系統調用的參數值(位於寄存器中),最後兩個值依次是堆棧指針和指令計數器的值。如果當前進程雖然阻塞,但阻塞函數並不是系統調用,則系統調用號的值為-1
,後面只有堆棧指針和指令計數器的值。如果進程沒有阻塞,則這個文件只有一個「running
」的字符串。
內核編譯時打開了CONFIG_HAVE_ARCH_TRACEHOOK
編譯選項,才會生成這個文件。
wchan
/proc/[pid]/wchan
顯示當進程sleep
時,kernel
當前運行的函數。舉例如下:
# cat /proc/2948/wchan kauditd_