Linux /proc/$pid部分内容详解

摘要:
auxv/proc/[pid]/auxv包含传递给进程的ELF解释器信息,格式是每一项都是一个unsignedlong长度的ID加上一个unsignedlong长度的值。举例如下:#hexdump-x/proc/2948/auxv0000000002100000000000000001a827ffd000000000100010000000000000dbf51fc90000000000000200006000000000000100000000000000000000300011000000000000006400000000000000000400003000000000000204043267f4a000000000500004000000000000003800000000000000000600005000000000000000900000000000000000700007000000000000f00043037f4a0000000008000080000000000000000000000000000000009000090000000000008e6743277f4a000000000a0000b000000000000000000000000000000000b0000c000000000000000000000000000000000c0000d000000000000000000000000000000000d0000e000000000000000000000000000000000e00017000000000000000000000000000000000f000190000000000003de91a807ffd00000000100001f0000000000004fe51a807ffd00000000110000f0000000000003df91a807ffd00000000120000000000000000000000000000000000000130解析这个文件可以参考这段代码。cmdline/proc/[pid]/cmdline是一个只读文件,包含进程的完整命令行信息。举例如下:#cat/proc/2948/commlibvirtdcwd/proc/[pid]/cwd是进程当前工作目录的符号链接。举例如下:#ls-lt/proc/2948/cwdlrwxrwxrwx1rootroot0Nov912:14/proc/2948/cwd-˃/environ/proc/[pid]/environ显示进程的环境变量。举例如下:#strings/proc/2948/environLANG=POSIXLC_CTYPE=en_US.UTF-8PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binNOTIFY_SOCKET=@/org/freedesktop/systemd1/notifyLIBVIRTD_CONFIG=/etc/libvirt/libvirtd.confLIBVIRTD_ARGS=--listenLIBVIRTD_NOFILES_LIMIT=2048exe/proc/[pid]/exe为实际运行程序的符号链接。举例如下:#ls-lt/proc/2948/exelrwxrwxrwx1rootroot0Nov513:04/proc/2948/exe-˃/usr/sbin/libvirtdfd/proc/[pid]/fd是一个目录,包含进程打开文件的情况。latency/proc/[pid]/latency显示哪些代码造成的延时比较大(使用

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_

免责声明:文章转载自《Linux /proc/$pid部分内容详解》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇QML 修改TableView和TreeView滚动条样式C# 的Color 颜色转换下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

linux php安装扩展方法 查找配置文件

如何在linux中查看nginx、apache、php、mysql配置文件路径了,如果你接收一个别人配置过的环境,但没留下相关文档。这时该怎么判断找到正确的加载文件路径了。可以通过以下来判断 1、判断apache 首先执行命令找到httpd路径 ps aux | grep httpd 如httpd路径为 /usr/local/apache/bin/http...

linux下常用文件传输命令 (转)

因为工作原因,需要经常在不同的服务器见进行文件传输,特别是大文件的传输,因此对linux下不同服务器间数据传输命令和工具进行了研究和总结。主要是rcp,scp,rsync,ftp,sftp,lftp,wget,curl。 rcp rcp不是一种安全的的传输文件的方式,rcp通过rsh(rsh见下面)来执行远程命令,要使用rcp必须经过一些配置,现在rcp...

linux(10)-linux环境下jdk配置自定义环境变量/etc/profile.d以及卸载自带openjdk

一、删除系统自带OpenJDK 以下操作,请切换至root权限进行操作 1.1、输入:rpm -qa | grep jdk  会查询出系统自带的OpenJDK及版本 [root@localhost /]# rpm -qa |grep jdkjava-1.7.0-openjdk-headless-1.7.0.51-2.4.5.5.el7.x86_64java...

linux磁盘空间满了 但是没有大文件

很常见的一个问题  linux磁盘空间满了 但是没有大文件   解决思路: 1、用df 检查发现/根目录可用空间为0 [root@/]#df -h 2、用du检查发现各目录占用的空间都很少,有约3G的空间莫名其妙地丢了. [root@/]# du -m –max-depth=1|sort -gr 3、用lsof检查后才发现原因是,有文件被删除,而进程还活着...

Linux下配置Tomcat为系统服务并开机自启动

如果我们使用war 包进行部署项目的时候,需要把包放进Tomcat的目录下,为了使我们的服务能够在服务器重启的时候自动启动起来,我们需要把Tomcat设置成自起服务。 配置 Tomcat 服务 新建服务脚本[root@localhost ~]# vim /etc/init.d/tomcat 添加脚本内容#!/bin/bash# description: T...

VMware虚拟机中如何安装VMWareTools详解

VMware虚拟机中如何安装VMWare-Tools详解 好处:可以支持图形界面,可以支持共享文件功能等VMware虚拟机中如何配置显卡 VMware作为一款虚拟机利器,很多人都利用它来实现Linux与Windows的和平共处。相对于普通的多重引导,有了VMware,Linux对磁盘空间变得不再挑剔,不需要像多重系统那样要求独霸某个分区,随便在哪个Wind...