linux概念之进程分析

http://blog.csdn.net/kevinx_xu/article/details/8178746  /proc 详解

内核线程分析报告

进程层次

[root@109-com1 scripts]# ps -ef|grep udevd
root       431     1  0 Aug28 ?        00:00:00 /sbin/udevd -d
root      1199   431  0 Aug28 ?        00:00:00 /sbin/udevd -d
root     19382   431  0 Aug30 ?        00:00:00 /sbin/udevd -d
[root@109-com1 scripts]# ps -ef|grep 1161
root      1161     1  0 Aug28 ?        00:00:03 /usr/libexec/postfix/master
postfix   1176  1161  0 Aug28 ?        00:00:01 qmgr -l -t fifo -u
postfix  30258  1161  0 13:35 ?        00:00:00 pickup -l -t fifo -u

root      1383     1  0 Aug28 ?        00:00:02 /usr/sbin/sshd
root     29538  1383  0 Sep03 ?        00:00:01 sshd: root@pts/2
root     29540 29538  0 Sep03 pts/2    00:00:00 -bash
root      2088 29540  0 14:08 pts/2    00:00:00 ps -ef

rpcuser  29223     1  0 Sep03 ?        00:00:00 rpc.statd --no-notify
rpc      29426     1  0 Sep03 ?        00:00:00 rpcbind
rpcuser  29433     1  0 Sep03 ?        00:00:00 rpc.statd --no-notify

[root@221-comecs tmp]# pstree -p
        ├─safe_asterisk(3732)───asterisk(3735)─┬─{asterisk}(3737)
        │                                      ├─{asterisk}(3738)
        │                                      ├─{asterisk}(3739)
        │                                      ├─{asterisk}(3740)
        │                                      ├─{asterisk}(3741)
        │                                      ├─{asterisk}(3742)
        │                                      ├─{asterisk}(3743)
[root@221-comecs tmp]# ps -Lf 3735  进程共启动了n个线程
UID        PID  PPID   LWP  C NLWP STIME TTY      STAT   TIME CMD
root      3735  3732  3735  0   61 Oct09 ?        Sl     0:00 /usr/sbin/asterisk -f -vvvg -c
root      3735  3732  3737  0   61 Oct09 ?        Sl     0:00 /usr/sbin/asterisk -f -vvvg -c
root      3735  3732  3738  0   61 Oct09 ?        Sl     0:00 /usr/sbin/asterisk -f -vvvg -c
root      3735  3732  3739  0   61 Oct09 ?        Sl     0:08 /usr/sbin/asterisk -f -vvvg -c

/proc/stat    总
/proc/loadavg
/proc/sched_debug
/proc/schedstat 总

/proc/pid/schedstat 分
/proc/pid/sched
/proc/pid/stack
/proc/pid/stat    分
/proc/pid/statm
/proc/pid/status
/proc/pid/maps
/proc/pid/smaps

/proc/loadavg文件
[root@-com1 ]# cat ../loadavg
0.01 0.03 0.00 /
[root@-com1 ]# grep run /proc/stat
procs_running 每个值的含义为:
参数 解释
lavg_1 (1.0) -分钟平均负载
lavg_5 (1.00) -分钟平均负载
lavg_15(0.93) -分钟平均负载
nr_running () 在采样时刻,运行队列的任务的数目,与/proc/stat的procs_running表示相同意思
nr_threads () 在采样时刻,系统中活跃的任务的个数(不包括运行已经结束的任务)
last_pid() 最大的pid值,包括轻量级进程,即线程。
假设当前有两个CPU,则每个CPU的当前任务数为4./=2.31 /proc/pid/smaps文件
该文件反映了该进程的相应线性区域的大小
解释说明:
每行数据格式如下:
(内存区域)开始-结束 访问权限 偏移 主设备号:次设备号 i节点 文件。
be8f1000-be906000 rwxp be8f1000 : [stack]
Size:相应虚拟地址空间的大小
RSS: 正在使用的物理内存的大小
Shared_Clean: 共享区域的未使用页数
Shared_Dirty: 共享区域已经使用的页数
Private_Clean: 私有区域未使用的页数
Private_Dirty: 私有区域已经使用的页数 /proc/pid/maps文件,上面的smaps的更为详细,maps为列表
该文件反映了进程占用的内存区域
每行数据格式如下:
(内存区域)开始-结束 访问权限 偏移 主设备号:次设备号 i节点 文件。
/proc/pid/statm包含了在此进程中所有CPU活跃的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。
top命令中看到的VIRT PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
root 2332m 184m S 16.9 18.5 : asterisk
root 2826m 36m S 3.7 3.7 :34.83 FLTService 在/proc/pid/statm中看到的 [root@-com1 ]# cat statm 每列含义解释:
2826m*/=723692  top中的PID为6939的VIRT字段2826m
Size (pages)= 任务虚拟地址空间的大小 VmSize/
36m*/=9315    top中的PID为6939的RES字段36m
Resident(pages)= 应用程序正在使用的物理内存的大小 VmRSS/
/=1479      top中的PID为6939的SHR字段5916
Shared(pages)= 共享页数 status文件中的VmExe: kB行 /=
Trs(pages)= 程序所拥有的可执行虚拟内存的大小 VmExe/
status文件中的VmLib: kB行 有问题的
Lrs(pages)= 被映像到任务的虚拟内存空间的库的大小 VmLib/ status文件中的下两行即2771312+/=
VmData: kB
VmStk: kB
Drs(pages)= 程序数据段和用户态的栈的大小 (VmData+VmStk)/ dt(pages) 此文件字段较多
/proc/pid/stat
参数解释
pid=1 进程(包括轻量级进程,即线程)号
comm= linuxrc 应用程序或命令的名字
task_state=S 任务的状态,R:runnign, S:sleeping (TASK_INTERRUPTIBLE), D:disk sleep (TASK_UNINTERRUPTIBLE), T: stopped, T:tracing stop,Z:zombie, X:dead
ppid=0 父进程ID
pgid=0 线程组号
sid=0 c该任务所在的会话组ID
tty_nr=0(pts/3) 该任务的tty终端的设备号,INT(0/256)=主设备号,(0-主设备号)=次设备号
tty_pgrp=-1 终端的进程组号,当前运行在该任务所在终端的前台任务(包括shell 应用程序)的PID。
task->flags=8388864进程标志位,查看该任务的特性
min_flt=50该任务不需要从硬盘拷数据而发生的缺页(次缺页)的次数
cmin_flt=633 累计的该任务的所有的waited-for进程曾经发生的次缺页的次数目
maj_flt=20该任务需要从硬盘拷数据而发生的缺页(主缺页)的次数
cmaj_flt=4 累计的该任务的所有的waited-for进程曾经发生的主缺页的次数目
utime=2 该任务在用户态运行的时间,单位为jiffies
stime=357 该任务在核心态运行的时间,单位为jiffies
cutime=72 累计的该任务的所有的waited-for进程曾经在用户态运行的时间,单位为jiffies
cstime=342 累计的该任务的所有的waited-for进程曾经在核心态运行的时间,单位为jiffies
priority=16 任务的动态优先级
nice=0 任务的静态优先级
num_threads=1 该任务所在的线程组里线程的个数
it_real_value=0 由于计时间隔导致的下一个 SIGALRM 发送进程的时延,以 jiffy 为单位.
start_time=22 该任务启动的时间,单位为jiffies
vsize=2252800(bytes) 该任务的虚拟地址空间大小
rss=70(page) 该任务当前驻留物理地址空间的大小
Number of pages the process has in real memory,minu 3 for administrative purpose.
这些页可能用于代码,数据和栈。
rlim=4294967295=0xFFFFFFFF(bytes) 该任务能驻留物理地址空间的最大值
start_code=32768=0x8000  该任务在虚拟地址空间的代码段的起始地址(由连接器决定)
end_code=1879936该任务在虚拟地址空间的代码段的结束地址
start_stack=3199270704=0Xbeb0ff30该任务在虚拟地址空间的栈的开始地址
kstkesp=3199269552  sp(32 位堆栈指针) 的当前值, 与在进程的内核堆栈页得到的一致.
kstkeip=1113432 =0X10FD58 指向将要执行的指令的指针, PC(32 位指令指针)的当前值.
pendingsig=0 待处理信号的位图,记录发送给进程的普通信号
block_sig=0 阻塞信号的位图
sigign=0 忽略的信号的位图
sigcatch=674311被俘获的信号的位图
wchan=3221479524  如果该进程是睡眠状态,该值给出调度的调用点
nswap=0 被swapped的页数
cnswap=0 所有子进程被swapped的页数的和
exit_signal=0  该进程结束时,向父进程所发送的信号
task_cpu(task)=0 运行在哪个CPU上
task_rt_priority=0 实时进程的相对优先级别
task_policy=0 进程的调度策略,0=非实时进程,1=FIFO实时进程;2=RR实时进程 
/proc/pid/status Name 应用程序或命令的名字
State 任务的状态,运行/睡眠/僵死/
SleepAVG 任务的平均等待时间(以nanosecond为单位),交互式任务因为休眠次数多、时间长,它们的 sleep_avg 也会相应地更大一些,所以计算出来的优先级也会相应高一些。
Tgid= 线程组号
Pid= 任务ID
Ppid= 父进程ID
TracerPid= 接收跟踪该进程信息的进程的ID号
Uid Uid euid suid fsuid
Gid Gid egid sgid fsgid
FDSize= 文件描述符的最大个数,最多能打开的文件句柄的个数file->fds
Groups:
VmPeak: kB /*进程地址空间的大小*/
VmHWM: kB /*文件内存映射和匿名内存映射的大小*/
VmSize(KB)= 任务虚拟地址空间的大小 (total_vm-reserved_vm),其中total_vm为进程的地址空间的大小,reserved_vm:进程在预留或特殊的内存间的物理页
VmLck(KB)= 任务已经锁住的物理内存的大小。锁住的物理内存不能交换到硬盘 (locked_vm)
VmRSS(KB)= kB 应用程序正在使用的物理内存的大小,就是用ps命令的参数rss的值 (rss)
VmData(KB)=20KB 程序数据段的大小(所占虚拟内存的大小),存放初始化了的数据; (total_vm-shared_vm-stack_vm)
VmStk(KB)=84KB 任务在用户态的栈的大小 (stack_vm)
VmExe(KB)=4KB 程序所拥有的可执行虚拟内存的大小,代码段,不包括任务使用的库 (end_code-start_code)
VmLib(KB)=1300KB 被映像到任务的虚拟内存空间的库的大小 (exec_lib)
VmPTE=6KB 该进程的所有页表的大小,单位:kb
Threads= 共享使用该信号描述符的任务的个数,在POSIX多线程序应用程序中,线程组中的所有线程使用同一个信号描述符。
SigQ 待处理信号的个数
SigPnd 屏蔽位,存储了该线程的待处理信号
ShdPnd 屏蔽位,存储了该线程组的待处理信号
SigBlk 存放被阻塞的信号
SigIgn 存放被忽略的信号
SigCgt 存放被俘获到的信号
CapInh Inheritable,能被当前进程执行的程序的继承的能力
CapPrm Permitted,进程能够使用的能力,可以包含CapEff中没有的能力,这些能力是被进程自己临时放弃的,CapEff是CapPrm的一个子集,进程放弃没有必要的能力有利于提高安全性
CapEff Effective,进程的有效能力

Linux下进程信息的深入分析
这里我们主要介绍进程的状态,进程的状态可以通过/proc/PID/status来查看,也可以通过/proc/PID/stat来查看.
如果说到工具大家用的最多的ps也可以看到进程的信息.这里我们通过/proc/PID/status来分析进程的信息.
在2.6.18之后的内核,多了capibilty/cpusets等信息.
[root@localhost 1499]# ps -He
[root@localhost 1499]# cd /proc/1499/
[root@localhost 1499]# more status
State: S (sleeping)
解释:进程的状态我们前文已经做了很详细的分析,各进程的状态代表的意义如下:
R (running)", "S (sleeping)", "D (disk sleep)", "T (stopped)", "T(tracing stop)", "Z (zombie)", or "X (dead)"
Tgid: 1499
解释:Tgid是线程组的ID,一个线程一定属于一个线程组(进程组).
Pid: 987
解释:这个是进程的ID,更准确的说应该是线程的ID.
注:/proc/pid/status中的Pid就是ps命令的LWP列输出,PID一列其实是进程组,而LWP是轻量级进程,也就是线程,因为所有的进程必须一个线程,那就是它自己.
FDSize: 32
解释:
FDSize是当前分配的文件描述符,这个值不是当前进程使用文件描述符的上限.
我们看到这里是32,但实际并没有分配32个文件,如下:
我们看到这里只用到了18个文件描述符.而如果超过32个文件描述符,将以32进行递增,如果是64位系统,将以64进行递增.
FDSize这个值不会减少,如果我们程序打开了300个文件,并不会因为关闭文件,而减少FDSize这个值.

voluntary_ctxt_switches: 1
nonvoluntary_ctxt_switches: 0
voluntary_ctxt_switches表示进程主动切换的次数.
nonvoluntary_ctxt_switches表示进程被动切换的次数.
首先查看一下当前进程,如下:
echo $$
1544
执行如下命令:
while ((1)); do echo 1; sleep 1; done
查看该进程的主动切换与被动切换,如下:
cat status

voluntary_ctxt_switches: 949
nonvoluntary_ctxt_switches: 55
我们看到主动切换和被动切换有了明显的变化.

查看进程打开的文件

lsof -c bash  查看进程所打开的文件
bash    2036  ff1  255u   CHR  136,0      0t0      3 /dev/pts/0
bash    2059 root  cwd    DIR  253,0     4096 391887 /home/ff1/Desktop
bash    2083 root  cwd    DIR    0,3        0  12786 /proc/1481
bash    2083 root  rtd    DIR  253,0     4096      2 /

lsof -p 2083  查看pid所打开的文件
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
bash    2083 root  cwd    DIR    0,3        0  12786 /proc/1481
bash    2083 root  rtd    DIR  253,0     4096      2 /
bash    2083 root  txt    REG  253,0   938832 130612 /bin/bash
bash    2083 root  mem    REG  253,0   156928 392183 /lib64/ld-2.12.so

[root@localhost bin]# ps -ef|grep ssh  查看进程pid
root      1481     1  0 05:07 ?        00:00:00 /usr/sbin/sshd
root      2079  1481  0 05:15 ?        00:00:00 sshd: root@pts/1
root      2155  2083  0 05:53 pts/1    00:00:00 grep ssh
[root@localhost bin]# lsof /usr/sbin/sshd  查看打开文件对应的进程
COMMAND  PID USER  FD   TYPE DEVICE SIZE/OFF   NODE NAME
sshd    1481 root txt    REG  253,0   546680 675770 /usr/sbin/sshd
sshd    2079 root txt    REG  253,0   546680 675770 /usr/sbin/sshd

lsof -p 2079

sshd    2079 root    0u   CHR                1,3      0t0   3968 /dev/null
sshd    2079 root    1u   CHR                1,3      0t0   3968 /dev/null
sshd    2079 root    2u   CHR                1,3      0t0   3968 /dev/null
sshd    2079 root    3r  IPv4              19029      0t0    TCP 192.168.2.131:ssh->192.168.2.191:51500 (ESTABLISHED)
sshd    2079 root    4w  unix 0xffff88001f408680      0t0  19100 socket
sshd    2079 root    5u  FIFO                0,8      0t0  19103 pipe
sshd    2079 root    6w  FIFO                0,8      0t0  19103 pipe
sshd    2079 root    7u   CHR                5,2      0t0   5672 /dev/ptmx
sshd    2079 root    9u   CHR                5,2      0t0   5672 /dev/ptmx
sshd    2079 root   10u   CHR                5,2      0t0   5672 /dev/ptmx
[root@localhost fd]# cd /proc/2079/fd
[root@localhost fd]# ll
总用量 0
lrwx------. 1 root root 64 2月  27 05:15 0 -> /dev/null
lrwx------. 1 root root 64 2月  27 05:15 1 -> /dev/null
lrwx------. 1 root root 64 2月  27 05:50 10 -> /dev/ptmx
lrwx------. 1 root root 64 2月  27 05:15 2 -> /dev/null
lr-x------. 1 root root 64 2月  27 05:15 3 -> socket:[19029]
l-wx------. 1 root root 64 2月  27 05:15 4 -> socket:[19100]
lrwx------. 1 root root 64 2月  27 05:15 5 -> pipe:[19103]
l-wx------. 1 root root 64 2月  27 05:50 6 -> pipe:[19103]
lrwx------. 1 root root 64 2月  27 05:50 7 -> /dev/ptmx
lrwx------. 1 root root 64 2月  27 05:50 9 -> /dev/ptmx

[root@localhost bin]# lsof /bin/bash
COMMAND  PID USER  FD   TYPE DEVICE SIZE/OFF   NODE NAME
bash    2036  ff1 txt    REG  253,0   938832 130612 /bin/bash
bash    2059 root txt    REG  253,0   938832 130612 /bin/bash
bash    2083 root txt    REG  253,0   938832 130612 /bin/bash

进程与其线程信息采20次,每秒一次。
[root@-comecs ]# pidstat -p -t > /root/ [root@-comecs ]# pstree -U
init─┬─auditd───{auditd}
├─crond
├─master─┬─pickup
│ └─qmgr
├─*[mingetty]
├─rpc.statd
├─rpcbind
├─rsyslogd───*[{rsyslogd}]
├─safe_asterisk───asterisk───*[{asterisk}]
├─snmpd
├─sshd───sshd───bash───pstree
├─udevd───*[udevd]
└─vmtoolsd───{vmtoolsd}
[root@-comecs ]# pstree -A
init-+-auditd---{auditd}
|-crond
|-master-+-pickup
| `-qmgr
|-*[mingetty]
|-rpc.statd
|-rpcbind
|-rsyslogd---*[{rsyslogd}]
|-safe_asterisk---asterisk---*[{asterisk}]
|-snmpd
|-sshd---sshd---bash---pstree
|-udevd---*[udevd]
`-vmtoolsd---{vmtoolsd}
[root@-comecs ]# pstree -G
initqwqauditdqqq{auditd}
tqcrond
tqmasterqwqpickup
x mqqmgr
tq6*[mingetty]
tqrpc.statd
tqrpcbind
tqrsyslogdqqq3*[{rsyslogd}]
tqsafe_asteriskqqqasteriskqqq62*[{asterisk}]
tqsnmpd
tqsshdqqqsshdqqqbashqqqpstree
tqudevdqqq2*[udevd]
mqvmtoolsdqqq{vmtoolsd} 进程的层次关系,先内核态,再用户态,都是守护进程形式的
[root@-comecs ]# ps -efH
UID PID PPID C STIME TTY TIME CMD
root ? :: [kthreadd]
root ? :: [migration/]
root ? :: [ksoftirqd/]
root ? :: [migration/]
root ? :: [watchdog/]
root ? :: [migration/]
root ? :: [migration/]
root ? :: [ksoftirqd/]
root ? :: [watchdog/]
root ? :: [migration/]
root ? :: [migration/]
root ? :: [ksoftirqd/]
root ? :: [watchdog/]
root ? :: [migration/]
root ? :: [migration/]
root ? :: [ksoftirqd/]
root ? :: [watchdog/]
root ? :: [events/]
root ? :: [events/]
root ? :: [events/]
root ? :: [events/]
root ? :: [cgroup]
root ? :: [khelper]
root ? :: [netns]
root ? :: [async/mgr]
root ? :: [pm]
root ? :: [sync_supers]
root ? :: [bdi-default]
root ? :: [kintegrityd/]
root ? :: [kintegrityd/]
root ? :: [kintegrityd/]
root ? :: [kintegrityd/]
root ? :: [kblockd/]
root ? :: [kblockd/]
root ? :: [kblockd/]
root ? :: [kblockd/]
root ? :: [kacpid]
root ? :: [kacpi_notify]
root ? :: [kacpi_hotplug]
root ? :: [ata_aux]
root ? :: [ata_sff/]
root ? :: [ata_sff/]
root ? :: [ata_sff/]
root ? :: [ata_sff/]
root ? :: [ksuspend_usbd]
root ? :: [khubd]
root ? :: [kseriod]
root ? :: [md/]
root ? :: [md/]
root ? :: [md/]
root ? :: [md/]
root ? :: [md_misc/]
root ? :: [md_misc/]
root ? :: [md_misc/]
root ? :: [md_misc/]
root ? :: [linkwatch]
root ? :: [khungtaskd]
root ? :: [kswapd0]
root ? :: [ksmd]
root ? :: [khugepaged]
root ? :: [aio/]
root ? :: [aio/]
root ? :: [aio/]
root ? :: [aio/]
root ? :: [crypto/]
root ? :: [crypto/]
root ? :: [crypto/]
root ? :: [crypto/]
root ? :: [kthrotld/]
root ? :: [kthrotld/]
root ? :: [kthrotld/]
root ? :: [kthrotld/]
root ? :: [pciehpd]
root ? :: [kpsmoused]
root ? :: [usbhid_resumer]
root ? :: [kstriped]
root ? :: [mpt_poll_0]
root ? :: [mpt/]
root ? :: [scsi_eh_0]
root ? :: [scsi_eh_1]
root ? :: [scsi_eh_2]
root ? :: [kdmflush]
root ? :: [kdmflush]
root ? :: [jbd2/dm--]
root ? :: [ext4-dio-unwrit]
root ? :: [vmmemctl]
root ? :: [jbd2/sda1-]
root ? :: [ext4-dio-unwrit]
root ? :: [kauditd]
root ? :: [flush-:]
root ? :: [rpciod/]
root ? :: [rpciod/]
root ? :: [rpciod/]
root ? :: [rpciod/]
root ? :: [kslowd000]
root ? :: [kslowd001]
root ? :: [nfsiod]
root ? :: [lockd]
root ? :: [bluetooth]
root ? :: /sbin/init
root ? :: /sbin/udevd -d
root ? :: /sbin/udevd -d
root ? :: /sbin/udevd -d
root ? :: /usr/sbin/vmtoolsd
root ? :: auditd
root ? :: /sbin/rsyslogd -i /var/run/syslogd.pid -c
rpc ? :: rpcbind
rpcuser ? :: rpc.statd
root ? :: /usr/sbin/sshd
root : ? :: sshd: root@pts/
root : pts/ :: -bash
root : pts/ :: ps -efH
root ? :: /usr/libexec/postfix/master
postfix ? :: qmgr -l -t fifo -u
postfix : ? :: pickup -l -t fifo -u
root tty2 :: /sbin/mingetty /dev/tty2
root tty3 :: /sbin/mingetty /dev/tty3
root tty4 :: /sbin/mingetty /dev/tty4
root tty5 :: /sbin/mingetty /dev/tty5
root tty6 :: /sbin/mingetty /dev/tty6
root tty1 :: /sbin/mingetty /dev/tty1
root ? :: crond
root ? :: /usr/sbin/snmpd -LS0-6d -Lf /dev/null -p /var/run/snmpd.pid
root Feb13 ? :: /bin/sh /usr/sbin/safe_asterisk
root Feb13 ? :: /usr/sbin/asterisk -f -vvvg -c
[root@-comecs ]# [root@-comecs ]# ps --help
********* simple selection ********* ********* selection by list *********
-A all processes -C by command name
-N negate selection -G by real group ID (supports names)
-a all w/ tty except session leaders -U by real user ID (supports names)
-d all except session leaders -g by session OR by effective group name
-e all processes -p by process ID
T all processes on this terminal -s processes in the sessions given
a all w/ tty, including other users -t by tty
g OBSOLETE -- DO NOT USE -u by effective user ID (supports names)
r only running processes U processes for specified users
x processes w/o controlling ttys t by tty
*********** output format ********** *********** long options ***********
-o,o user-defined -f full --Group --User --pid --cols --ppid
-j,j job control s signal --group --user --sid --rows --info
-O,O preloaded -o v virtual memory --cumulative --format --deselect
-l,l long u user-oriented --sort --tty --forest --version
-F extra full X registers --heading --no-heading --context
********* misc options *********
-V,V show version L list format codes f ASCII art forest
-m,m,-L,-T,H threads S children in sum -y change -l format
-M,Z security data c true command name -c scheduling class
-w,w wide output n numeric WCHAN,UID -H process hierarchy [root@-comecs ]# ps -p
PID TTY TIME CMD
? :: asterisk
[root@-comecs ]# ps -fp
UID PID PPID C STIME TTY TIME CMD
root Feb13 ? :: /usr/sbin/asterisk -f -vvvg -c
[root@-comecs ]# ps -Fp
UID PID PPID C SZ RSS PSR STIME TTY TIME CMD
root Feb13 ? :: /usr/sbin/asterisk -f -vvvg -c
[root@-comecs ]# ps -efH [root@-comecs ]# ps -fp -m
UID PID PPID C STIME TTY TIME CMD
root ? :: /sbin/rsyslogd -i /var/run/syslogd.pid -c
root - - - :: -
root - - - :: -
root - - - :: -
root - - - :: -
[root@-comecs ]# ps -fp -L
UID PID PPID LWP C NLWP STIME TTY TIME CMD
root ? :: /sbin/rsyslogd -i /var/run/syslogd.pid -c
root ? :: /sbin/rsyslogd -i /var/run/syslogd.pid -c
root ? :: /sbin/rsyslogd -i /var/run/syslogd.pid -c
root ? :: /sbin/rsyslogd -i /var/run/syslogd.pid -c
[root@-comecs ]# ps -fp -T
UID PID SPID PPID C STIME TTY TIME CMD
root ? :: /sbin/rsyslogd -i /var/run/syslogd.pid -c
root ? :: /sbin/rsyslogd -i /var/run/syslogd.pid -c
root ? :: /sbin/rsyslogd -i /var/run/syslogd.pid -c
root ? :: /sbin/rsyslogd -i /var/run/syslogd.pid -c
[root@-comecs ]# ps -fp H
UID PID PPID C STIME TTY STAT TIME CMD
root ? Sl : /sbin/rsyslogd -i /var/run/syslogd.pid -c
root ? Sl : /sbin/rsyslogd -i /var/run/syslogd.pid -c
root ? Sl : /sbin/rsyslogd -i /var/run/syslogd.pid -c
root ? Sl : /sbin/rsyslogd -i /var/run/syslogd.pid -c
[root@-comecs ]# ps -fp m
UID PID PPID C STIME TTY STAT TIME CMD
root ? - : /sbin/rsyslogd -i /var/run/syslogd.pid -c
root - - - Sl : -
root - - - Sl : -
root - - - Sl : -
root - - - Sl : -
[root@-comecs ]# ps -fp -m
UID PID PPID C STIME TTY TIME CMD
root ? :: /sbin/rsyslogd -i /var/run/syslogd.pid -c
root - - - :: -
root - - - :: -
root - - - :: -
root - - - :: -

pid>fd>inode
11061>178>3252673

stat filename

ls -i filename

df -i

dumpe2fs

上面四个命令都可以查看相关的inode号

fd>pid>inode
[root@test1 fd]# asterisk -rx "com show online_trms"|grep 178
178 10004729 100080 014729415450 陕D01059:2 024:21:08 00:00:17 3 223.104.11.106 9925 70540 0 0 0
[root@test1 fd]# ss -np|grep 10000|grep 178
ESTAB 0 0 172.16.1.21:10000 223.104.11.106:9925 users:(("asterisk",11061,178))
[root@test1 fd]# cd /proc/11061/fd
[root@test1 fd]# ll|grep 178
lrwx------ 1 root root 64 Aug 18 15:58 178 -> socket:[3252673]
[root@test1 fd]# less /proc/net/tcp|grep 3252673
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
310: 150110AC:2710 6A0B68DF:26C5 01 00000000:00000000 02:0008C84D 00000000 0 0 3252673 2 ffff81010e346d00 2147 40 12 2 2

16进制转10进制的ip地址
150110AC:2710
150110AC=172.16.1.21 2710=10000
6A0B68DF:26C5
6A0B68DF=223.104.11.106 26C5=9925

那么这个socket:后面的一串数字是什么呢?其实是该socket的inode号。从linux内核代码net/socket.c 中可以看出,如下
/*
* sockfs_dname() is called from d_path().
*/
static char *sockfs_dname(struct dentry *dentry, char *buffer, int buflen)
{
return dynamic_dname(dentry, buffer, buflen, "socket:[%lu]",
dentry->d_inode->i_ino);
}

那么,知道了某个进程打开的socket的inode号后,我们可以做什么呢?这就涉及到/proc/net/tcp(udp对应/proc/net/udp)文件了,其中也列出了相应socket的inode号通过比对此字段,我们能在/proc/net/tcp下获得此套接口的其他信息,如对应的<本地地址:端口号,远端地址:端口号>对,窗口大小,状态等信息。具体字段含义详见net/ipv4/tcp_ipv4.c 中的 tcp4_seq_show 函数。cat /proc/net/tcp 如下:
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
19: 0100007F:83B8 0100007F:A57D 01 00000000:00000000 00:00000000 00000000 0 0 10879 1 f622edc0 20 4 31 3 -1
20: 0100007F:0FA0 0100007F:AA06 01 00000000:00000000 00:00000000 00000000 0 0 7326842 1 f5504dc0 20 4 11 5 -1

深入分析Linux内核源码-第五章进程调度

http://www.chinaunix.net/old_jh/6/32963.html

http://hi.baidu.com/_kouu/item/7111e61acd04a9f487ad4ed0  linux进程状态浅析

http://hi.baidu.com/_kouu/item/38c81042455c97d2c1a592d9  linux进程调度浅析

上一篇:Android权限Uri.parse


下一篇:Effective Java Item3:Enforce the singleton property with a private constructor or an enum type