linux proc分析(DOC)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

linux proc详解
proc文件系统总览:
在unix like操作系统中,几乎所有的数据实体都被抽象成文件。

可以认为procfs文件系统的作用是将内核信息抽象成文件接口,内核信息和可设置参数都以文件的形式存在,并组成1个目录树。

使得用户可通过文件系统接口(echo,cat等命令,只要权限允许)来获取和调整内核状态。

同时procfs文件系统也为用户提供了1个接口,使得用户的内核模块或用户态程序可通过procfs传递参数。

linux中的一些系统工具需要通过procfs获取内核参数,比如ps、lspci等命令。

可通过以下命令加载1个procfs文件系统(首先需要确认目标系统支持procfs):
# mount –t proc none /proc
也可在/etc/fstab文件中加入以下命令,使得系统在启动时自动加载procfs:
none /proc proc defaults 0 0
在proc文件系统中,主要包含3部分内容,进程相关部分、系统信息部分以及各子系统相关部分。

以下为1个典型的procfs文件系统目录示例:
> ls /proc
1 2 2166 2281 cmdline interrupts meminfo stat
13 2001 2167 3 cpuinfo iomem misc swaps
1646 2042 2168 4 crypto ioports modules sys
1780 2058 2169 5 devices irq mounts sysrq-trigger
1834 2087 2170 6 dma isapnp mtrr sysvipc
1838 2096 2171 7 driver kcore net tty
1857 2107 2207 71 execdomains kmsg partitions uptime
1877 2117 2208 8 fb ksyms pci version
1889 2143 2216 9 filesystems loadavg scsi
1905 2153 2217 apm fs locks self
1960 2165 2219 bus ide mdstat slabinfo
从以上输出中可看到procfs所包含的内容:
1.进程相关部分(只读):
在procfs中存在一些以数字(pid)命名的目录,该数字即为对应进程的pid。

/proc/self目录是1个指向当前进程的符号链接。

当用户执行cat self/cmdline命令时,会为执行cat 命令而创建1个进程,并输出当前进程的命令行参数,也就是catself/cmdline(会省略空格)。

2.内核信息部分(只读):
这部分文件一般位于/proc目录下,可通过cat命令进行查看。

会在/proc/cmdline文件中保存内核引导时的命令行参数:
cat /proc/cmdline
ro root=/dev/hda2
3.内核各子系统相关部分(部分可调):
在proc文件系统中会保存内核各子系统的信息和可调参数。

主要有:
(1)bus :总线信息;
(2)drivers :驱动信息;
(3)fs :文件系统特别信息;
(4)ide :IDE接口信息;
(5)irq :IRQ信息:
(6)net :网络子系统信息;
(7)scsi :SCSI系统信息;
(8)sysvipc :IPC子系统信息;
(9)tty :tty子系统信息(以上9项均为只读的);
(10)sys :系统内核可调参数。

linux内核中的大部分可调整参数被放置到/proc/sys目录下,这些参数以常规文件的形式体现,并可通过echo、cat等文件操作命令进行调整。

在linux中也可通过sysctl方法来调整内核参数。

sysctl方法是从BSD系统继承而来的1种动态调整内核参数的方法。

在使用sysctl方法时,可将配置参数保存在/etc/sysctl.conf文件中,以便在启动时自动
加载这些配置
进程相关子目录:
在/proc目录下存在一系列以数字命名的子目录,每个目录对应系统中当前存在的1个进程,目录名即为进程pid。

进程相关目录用来存放对应进程的相关信息。

进程相关目录中存在如下文件:
可通过读取/proc/pid目录下的status文件,获得pid进程的当前状态。

>cat /proc/self/status #/proc/self为指向当前执行进程的符号链接Name: cat
State: R (running)
Pid: 5452
PPid: 743
TracerPid: 0 (2.4)
Uid: 501 501 501 501
Gid: 100 100 100 100
Groups: 100 14 16
VmSize: 1112 kB
VmLck: 0 kB
VmRSS: 348 kB
VmData: 24 kB
VmStk: 12 kB
VmExe: 8 kB
VmLib: 1044 kB
SigPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000000
SigCgt: 0000000000000000
CapInh: 00000000fffffeff
CapPrm: 0000000000000000
CapEff: 0000000000000000
以上示例显示的进程信息与用户执行/bin/ps命令获得的进程信息基本相同,这是因为ps命令也是通过procfs来获取进程信息的。

在statm文件中记录了进程内存信息,如下所示:
cat /proc/self/statm
105 105 93 4 12 89 12
以上输出信息含义如下:
size :程序大小;
resident :常驻内存空间大小;
shared :共享内存页数;
trs :代码段占用内存页数;
drs :数据/堆栈段占用内存页数;
lrs :引用库占用内存页数;
dt :脏页数量。

内核数据信息:
/proc目录下的某些文件和目录记录了内核相关信息,这些文件有如下几种(根据系统配置和所加载的模块,不同系统所显示的文件种类不同):
可使用系统中的文件访问命令访问/proc目录中的文件(只要权限允许),例如查看系统中断信息:cat /proc/interrupts
CPU0
0: 8728810 XT-PIC timer
1: 895 XT-PIC keyboard
2: 0 XT-PIC cascade
3: 531695 XT-PIC aha152x
4: 2014133 XT-PIC serial
5: 44401 XT-PIC pcnet_cs
8: 2 XT-PIC rtc
11: 8 XT-PIC i82365
12: 182918 XT-PIC PS/2 Mouse
13: 1 XT-PIC fpu
14: 1232265 XT-PIC ide0
15: 7 XT-PIC ide1
NMI: 0
在2.4版本内核中,当使能smp时这个文件末尾会多出2行smp相关属性LOC & ERR:
cat /proc/interrupts
CPU0 CPU1
0: 1243498 1214548 IO-APIC-edge timer
1: 8949 8958 IO-APIC-edge keyboard
2: 0 0 XT-PIC cascade
5: 11286 10161 IO-APIC-edge soundblaster
8: 1 0 IO-APIC-edge rtc
9: 27422 27407 IO-APIC-edge 3c503
12: 113645 113873 IO-APIC-edge PS/2 Mouse
13: 0 0 XT-PIC fpu
14: 22491 24012 IO-APIC-edge ide0
15: 2183 2415 IO-APIC-edge ide1
17: 30564 30414 IO-APIC-level eth0
18: 177 164 IO-APIC-level bttv
NMI: 2457961 2457959
LOC: 2457882 2457881
ERR: 2155
NMI是每个cpu上产生的不可屏蔽中断(Non Maskable Interrupt)计数。

LOC是每个cpu上APIC本地中断计数。

ERR是smp系统中IO-APIC总线失败错误的计数。

若该数值较高,可能当前内核的运行会有问题,此时可能需要测试内核,查看硬件和APIC是否有兼容性问题。

ide设备:
/proc/ide目录包含内核识别出的所有ide设备的信息。

在/proc/ide目录下包含drivers文件和若干个以ide设备或ide控制器命名的子目录。

ls -alF /proc/ide/
total 3
dr-xr-xr-x 4 root root 0 10月9 23:36 ./
dr-xr-xr-x 54 root root 0 2004-10-10 ../
-r--r--r-- 1 root root 0 10月9 23:36 drivers
lrwxrwxrwx 1 root root 8 10月9 23:36 hda -> ide0/hda/
lrwxrwxrwx 1 root root 8 10月9 23:36 hdb -> ide0/hdb/
lrwxrwxrwx 1 root root 8 10月9 23:36 hdc -> ide1/hdc/
dr-xr-xr-x 4 root root 0 10月9 23:36 ide0/
dr-xr-xr-x 3 root root 0 10月9 23:36 ide1/
-r--r--r-- 1 root root 0 10月9 23:36 piix
在/proc/ide/drivers文件中记录了当前加载的ide设备驱动:
cat /proc/ide/drivers
ide-floppy version 0.99.newide
ide-disk version 1.17
ide-default version 0.9.newide
在/proc/ide目录下还存在一些以设备命名的目录,比如piix是某系统中ide控制芯片组的名字(在其它系统中,ide控制芯片组可能是其它名字)。

此外还包含若干以ide控制器命名的目录(一般pc系统为2个),以及以ide终端设备命名的快捷方式,它们将链接到控制器目录下对应的设备文件中。

在/proc/ide目录下存在以下文件和目录:
当前连接在控制器上的每个设备也作为1个单独的子目录(比如/proc/ide/ide0/hda目录):
每个ide设备目录下的settings文件中包含该驱动器相关信息:cat /proc/ide/ide0/hda/settings
name value min max mode
---- ----- --- --- ----
bios_cyl 526 0 65535 rw
bios_head 255 0 255 rw
bios_sect 63 0 63 rw
breada_readahead 4 0 127 rw
bswap 0 0 1 r
file_readahead 72 0 2097151 rw
io_32bit 0 0 3 rw keepsettings 0 0 1 rw
max_kb_per_request 122 1 127 rw
multcount 0 0 8 rw
nice1 1 0 1 rw
nowerr 0 0 1 rw
pio_mode write-only 0 255 w
slow 0 0 1 rw
unmaskirq 00 1 rw
using_dma 0 0 1 rw
网络信息:
/proc/net子目录包含系统中网络相关信息,若内核支持ipv6,则还存在一些ipv6相关信息如下表(包括但不限于):
用户可访问相应文件来查看系统中可用的网络设备,以及这些设备的流量和路由信息:
cat /proc/net/dev
Inter-|Receive |[...
face |bytes packets errs drop fifo frame compressed multicast|[...
lo: 908188 5596 0 0 0 0 0 0 [...
ppp0:15475140 20721 410 0 0 410 0 0 [...
eth0: 614530 7085 0 0 0 0 0 1 [...
...] Transmit
...] bytes packets errs drop fifo colls carrier compressed
...] 908188 5596 0 0 0 0 0 0
...] 1375103 17405 0 0 0 0 0 0
...] 1703981 5535 0 0 0 3 0 0
若系统使能了Ethernet Channel特性,则允许若干物理接口绑定为1个逻辑设备。

该逻辑设备对应1个以设备命名的子目录,其中包含一些bond模块相关的特殊信息。

例如把eth0和eth1绑定为bond0设备,则可在/proc/net/bond0目录下查看bond相关信息,例如主从接口,链路状态等。

scsi设备信息:
若系统中含有scsi设备,那么在/proc/scsi目录下可以看到系统识别到的SCSI设备相关信息:
>cat /proc/scsi/scsi
Attached devices:
Host: scsi0 Channel: 00 Id: 00 Lun: 00
Vendor: IBM Model: DGHS09U Rev: 03E0
Type: Direct-Access ANSI SCSI revision: 03
Host: scsi0 Channel: 00 Id: 06 Lun: 00
Vendor: PIONEER Model: CD-ROM DR-U06S Rev: 1.04
Type: CD-ROM ANSI SCSI revision: 02
系统中的SCSI设备将映射到/proc/scsi目录下形成一个子树,按照对应的设备模块和设备总线号可以查看相应设备的参数信息,例如一个Adaptec AHA-2940 SCSI 适配器:
> cat /proc/scsi/aic7xxx/0
Adaptec AIC7xxx driver version: 5.1.19/3.2.4
Compile Options:
TCQ Enabled By Default : Disabled
AIC7XXX_PROC_STATS : Disabled
AIC7XXX_RESET_DELAY : 5
Adapter Configuration:
SCSI Adapter: Adaptec AHA-294X Ultra SCSI host adapter
Ultra Wide Controller
PCI MMAPed I/O Base: 0xeb001000
Adapter SEEPROM Config: SEEPROM found and used.
Adaptec SCSI BIOS: Enabled
IRQ: 10
SCBs: Active 0, Max Active 2,
Allocated 15, HW 16, Page 255
Interrupts: 160328
BIOS Control Word: 0x18b6
Adapter Control Word: 0x005b
Extended Translation: Enabled
Disconnect Enable Flags: 0xffff
Ultra Enable Flags: 0x0001
Tag Queue Enable Flags: 0x0000
Ordered Queue Tag Flags: 0x0000
Default Tag Queue Depth: 8
Tagged Queue By Device array for aic7xxx host instance 0:
{255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255} Actual queue depth per device for aic7xxx host instance 0:
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
Statistics:
(scsi0:0:0:0)
Device using Wide/Sync transfers at 40.0 MByte/sec, offset 8 Transinfo settings: current(12/8/1/0), goal(12/8/1/0), user(12/15/1/0) Total transfers 160151 (74577 reads and 85574 writes)
(scsi0:0:6:0)
Device using Narrow/Sync transfers at 5.0 MByte/sec, offset 15 Transinfo settings: current(50/15/0/0), goal(50/15/0/0), user(50/15/0/0) Total transfers 0 (0 reads and 0 writes)
并口信息/proc/parport:
/proc/parport 包含系统并口信息,按照并口端口号(0,1,2,...)每个设备将映射到一个子目录中。

在这个目录下包含的信息如Table 1-8. ..............................................................................
文件名内容
autoprobe IEEE-1284 标准兼容的设备ID信息
devices 端口使用的设备驱动列表
hardware 端口使用的base address, IRQ line 和DMA channel.
irq 端口使用的IRQ号,你可以写入一个新值指定IRQ号(IRQ number or none). ..............................................................................
TTY信息:
在/proc/tty目录中包含系统当前使用的tty及其信息,在该目录中也可找到设备信息和线路disciplines。

可访问/proc/tty/drivers文件来查看系统当前启用的ttys:
cat /proc/tty/drivers
pty_slave /dev/pts 136 0-255 pty:slave
pty_master /dev/ptm 128 0-255 pty:master
pty_slave /dev/ttyp 3 0-255 pty:slave
pty_master /dev/pty 2 0-255 pty:master
serial /dev/cua 5 64-67 serial:callout
serial /dev/ttyS 4 64-67 serial
/dev/tty0 /dev/tty0 4 0 system:vtmaster
/dev/ptmx /dev/ptmx 5 2 system
/dev/console /dev/console 5 1 system:console
/dev/tty /dev/tty 5 0 system:/dev/tty
unknown /dev/tty 4 1-63 console
可通过文件访问命令访问/proc目录下的大部分文件(只要权限允许)。

若利用文件访问命令访问/proc 目录下的某个文件时产生乱码,则该文件可能是1个特殊文件,需通过其它方法访问该文件。

比如/proc/kcore文件,可通过gdb等内核调试工具查看该文件,并且用户可通过ps、top等工具查看其它某些文件。

procfs的1个重要作用是查看和设置内核的状态信息,另一重要作用是对进程的监控和分析。

比如,若某个已加载的文件系统无法被卸载,系统会报如下错误:
# umount /db1
umount: /db1: device is busy
这是因为某些进程的工作目录还在该目录下,导致系统卷忙而无法被卸载,只有析构该进程后,才可卸载该文件系统。

可通过以下shell脚本查找该进程:
#!/bin/bash
#pcwd.sh,查找系统中工作在目标路径下的进程,使用方法: pcwd.sh 路径名
test $1 || { echo "Usage: pcwd.sh path(absolute path)" && exit };
PS=`ls /proc/*[0-9]*|grep :` ;
PSList=`echo $PS |tr -d '/proc'|tr -d ':'`;
for PID in $PSList
do
test -e /proc/$PID && (ls -alF /proc/$PID/cwd|grep $1 >/dev/null ) && echo "Process $PID (`cat /proc/$PID/status |grep Name |tr -d 'Name: '`) is work in $1 ";
done
可通过以上脚本文件获得执行命令前的当前系统进程表映像,然后遍历每个进程的proc目录,找到占用要卸载目录的进程。

在某系统执行以上脚本的输出如下:
[faye@frost.llnl]/tmp# ./pcwd.sh
Usage: pcwd.sh path(absolute path)
[faye@frost.llnl]/tmp# ./pcwd.sh /usr
Process 1283 (vi) is work in /usr ;
Process 3113 (bsh) is work in /usr ;
将上述脚本修改一下即可查看指定文件正在被哪些进程访问:
#!/bin/bash
test $1 || { echo "Usage: pfile.sh filename(absolute path)" && exit };
PS=`ls /proc/*[0-9]*|grep :` ;
PSList=`echo $PS |tr -d '/proc'|tr -d ':'`;
for PID in $PSList
do
test -e /proc/$PID && (ls -alF /proc/$PID/fd|grep $1 >/dev/null ) && echo "Process $PID (`cat /proc/$PID/status |grep Name |tr -d 'Name: '`) is openning $1;";
done
在某系统运行该脚本的输出为:
[faye@frost.llnl]/tmp# ./pfile.sh
Usage: pfile.sh filename(absolute path)
[faye@frost.llnl]/tmp# ./pfile.sh access_log
Process 109 (httpd) is openning access_log;
Process 110 (httpd) is openning access_log;
Process 112 (httpd) is openning access_log;
Process 113 (httpd) is openning access_log;
Process 116 (httpd) is openning access_log;
Process 99 (httpd) is openning access_log;
说明,目标文件名可使用相对或绝对路径,甚至也可只输入半个文件名,路径越精确查找结果越准确。

可以扩展上述脚本,以实现类似lsof命令的功能,列举系统中所有正在被使用的文件。

以下脚本通过读取proc文件系统中的信息,来模拟ps命令的实现:
#!/bin/bash
PS=`ls /proc/*[0-9]*|grep :` ;
PSList=`echo $PS |tr -d '/proc' |tr -d ':' |sort `;
echo -e "PID PPID UID GID STAT MEM TTY CMD"
for PID in $PSList
do
test -e /proc/$PID && sPID=`cat /proc/$PID/status |grep ^Pid: |awk '{print $2}'`
&& sPPID=`cat /proc/$PID/status |grep ^PPid: |awk '{print $2}'`
&& sTTY=`ls -alF /proc/$PID/fd |grep /dev/ |awk '{print $11}' |grep ty |head -n 1`
&& sUID=`cat /proc/$PID/status |grep ^Uid: |awk '{print $2}'`
&& sGID=`cat /proc/$PID/status |grep ^Gid: |awk '{print $2}'`
&& sSTAT=`cat /proc/$PID/status |grep ^State: |awk '{print $2 $3}'`
&& sMEM=`cat /proc/$PID/status |grep ^VmSize: |awk '{print $2 $3}'`
&& if [ -e /proc/$PID/exe ]
then
sCMD=`ls -alF /proc/$PID/exe |awk '{print $11}' |tr -d '$*' `
else
sCMD=`cat /proc/$PID/status |grep ^Name: |awk '{print $2}'`
sCMD="[ $sCMD ]"
fi
echo -e "$sPID $sPPID $sUID $sGID $sSTAT $sMEM $sTTY $sCMD"
done
以上脚本会列举系统中除自身进程(执行该脚本的进程)之外的所有进程,读取并显示这些进程的8项属性:进程id(PID)、父进程id(PPID)、属主UID(UID)、属主GID(GID)、当前状态、占用内存、运行终端、完整执行路径。

该脚本的输出格式参考了ps命令,例如某些系统进程没有对应的可执行文件,此时会显示它们的内核名字,例如[ksoftirqd_CPU0]。

以上脚本不需要参数,在某系统运行该脚本的输出如下:
[faye@frost.llnl]/tmp# ./lps.sh
PID PPID UID GID STAT MEM TTY CMD
1 0 0 0 S(sleeping) 1116kB /sbin/init
101 1 0 0 S(sleeping) 2168kB /usr/local/sbin/sshd
109 99 99 99 S(sleeping) 6100kB /usr/local/apache/bin/httpd
110 99 99 99 S(sleeping) 6100kB /usr/local/apache/bin/httpd
112 99 99 99 S(sleeping) 6100kB /usr/local/apache/bin/httpd
113 99 99 99 S(sleeping) 6100kB /usr/local/apache/bin/httpd
116 99 99 99 S(sleeping) 6100kB /usr/local/apache/bin/httpd
118 1 0 0 S(sleeping) 1656kB /bin/bash
119 1 0 0 S(sleeping) 1648kB /bin/bash
120 1 0 0 S(sleeping) 1648kB /bin/bash
128 1 0 0 S(sleeping) 2224kB /dev/tty1 /bin/login
1283 3113 0 0 S(sleeping) 1512kB /dev/ttyp0 /bin/vi
129 1 0 0 S(sleeping) 1136kB /dev/tty2 /sbin/getty
130 1 0 0 S(sleeping) 1136kB /dev/tty3 /sbin/getty
... ...
... ...
4 1 0 0 S(sleeping) [ kswapd ]
4 1 0 0 S(sleeping) [ kswapd ]
4 1 0 0 S(sleeping) [ kswapd ]
4089 15329 0 0 S(sleeping) 1664kB /dev/ttyp1 /bin/bash
4089 15329 0 0 S(sleeping) 1664kB /dev/ttyp1 /bin/bash
5 1 0 0 S(sleeping) [ bdflush ]
6 1 0 0 S(sleeping) [ kupdated ]
99 1 0 0 S(sleeping) 6016kB /usr/local/apache/bin/httpd
Solaris上有/usr/proc/bin工具集,里面的ptree和pmap很是好用,甚至比本来的ps还好:P可惜Linux 上是没有的,现在你可以自己写一个,用来综合显示更多的进程状态。

代码:
#!/bin/bash
#PROC=`mount |grep 'type proc'|awk '{print $3}'`
test $1 || { echo "Usage: pstat.sh PID" && exit };
PID=$1;
echo "Process $1 Status...";
echo "......................";
echo
cat /proc/$PID/status|grep ^Name:
cat /proc/$PID/status|grep ^Pid:
cat /proc/$PID/status|grep ^PPid:
cat /proc/$PID/status|grep ^Uid:
cat /proc/$PID/status|grep ^Gid:
cat /proc/$PID/status|grep ^State:
cat /proc/$PID/status|grep ^VmSize:
echo
CMD=`ls -alF /proc/$PID/exe |awk '{print $11}' |tr -d '$*'`;echo "Command path: $CMD"; ARG=`cat /proc/$PID/cmdline`;echo "Command line: $ARG";
CWD=`ls -alF /proc/$PID/cwd |awk '{print $11}'`;echo "CWD: $CWD";
echo
ENVI=`cat /proc/$PID/environ`;echo "ENVIRON: $ENVI";
echo
echo
echo "Process shared object:";
echo "......................";
cat /proc/$PID/maps |grep $CMD |grep xp;
cat /proc/$PID/maps |grep .so |grep xp;
echo
echo
echo "Process used file:";
echo "......................";
ls -alF /proc/$PID/fd |grep '->' |awk '{print $11}' |sort |uniq -c |sort -rn ;
echo
这个程序叫pstat.sh,可以显示进程的综合信息。

输出分为四段,分别是进程状态(包含父子进程关系、进程信任状以及内存占用),执行环境(包含进程执行程序,命令行参数和环境变量),进程执行对象(包含进程执行体和引用的共享库),最后是进程打开的所有文件。

代码:
[elly@frost.llnl]/tmp# ./pstat.sh
Usage: pstat.sh PID
[elly@frost.llnl]/tmp# ./pstat.sh 7238
Process 7238 Status...
......................
Name: vi
Pid: 7238
PPid: 3113
Uid: 0 0 0 0
Gid: 0 0 0 0
State: S (sleeping)
VmSize: 1648 kB
Command path: /bin/vi
Command line: vi
CWD: /usr/
ENVIRON: USERNAME=root
Process shared object:
......................
08048000-08098000 r-xp 00000000 03:01 3891 /bin/vi
40000000-40013000 r-xp 00000000 03:01 3942 /lib/ld-2.1.3.so 40016000-40019000 r-xp 00000000 03:01 4002 /lib/libtermcap.so.2.0.8 4001a000-40107000 r-xp 00000000 03:01 3949 /lib/libc-2.1.3.so
4010f000-40117000 r-xp 00000000 03:01 3981 /lib/libnss_files-2.1.3.so
Process used file:
......................
/dev/ttyp0
/etc/motd。

相关文档
最新文档