­

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顯示進程所佔用內存大小的統計信息,包含七個值,度量單位是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_