Linux /proc/$pid部分內容詳解【轉】


轉自: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顯示進程所占用內存大小的統計信息,包含七個值,度量單位是pagepage大小可通過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_


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM