Linux的/proc虚拟文件系统
Linux系统上的/proc目录是一种文件系统,即proc文件系统。与其它常见的文件系统不同的是,/proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态。
基于/proc文件系统如上所述的特殊性,其内的文件也常被称作虚拟文件,并具有一些独特的特点。例如,其中有些文件虽然使用查看命令查看时会返回大量信息,但文件本身的大小却会显示为0字节。此外,这些特殊文件中大多数文件的时间及日期属性通常为当前系统时间和日期,这跟它们随时会被刷新(存储于RAM中)有关。
为了查看及使用上的方便,这些文件通常会按照相关性进行分类存储于不同的目录甚至子目录中,如/proc/scsi目录中存储的就是当前系统上所有SCSI设备的相关信息,/proc/N中存储的则是系统当前正在运行的进程的相关信息,其中N为正在运行的进程(可以想象得到,在某进程结束后其相关目录则会消失)。
大多数虚拟文件可以使用文件查看命令如cat、more或者less进行查看,有些文件信息表述的内容可以一目了然,但也有文件的信息却不怎么具有可读性。不过,这些可读性较差的文件在使用一些命令如apm、free、lspci或top查看时却可以有着不错的表现。
一、进程信息
在/proc文件系统中,每一个进程都有一个相应的文件 。下面是/proc目录下的一些重要文件 :
/proc/pid/cmdline 包含了用于开始进程的命令 ;
/proc/pid/cwd包含了当前进程工作目录的一个链接 ;
/proc/pid/environ 包含了可用进程环境变量的列表 ;
/proc/pid/exe 包含了正在进程中运行的程序链接;
/proc/pid/fd/ 这个目录包含了进程打开的每一个文件的链接;
/proc/pid/mem 包含了进程在内存中的内容;
/proc/pid/stat包含了进程的状态信息;
/proc/pid/statm 包含了进程的内存使用信息。
下面是一些获取进程信息的例子:
/proc/pid/fd/ 目录提供 了有关打开文件的信息。要查看被进程使用的输入文件,使用以下命令 :
ls –l /proc/pid/fd/0
查看被进程使用socket,使用以下命令 :
ls –l /proc/pid/fd|sed –n `/socket/{s/.*/[//;s//]//p}`
有关这些socket的信息可以使用以下命令获取 :
netstat --ae
要将命令行参数传递给任意进程,使用以下命令 :
cat /proc/pid/cmdline
要 获取某一进程父进程的ID号,使用以下命令:
grep PPid/proc/pid/status
二、普通的系统信息
Proc包含了很多系统信息,这其中包括CPU负载、文件系统和网络配置 。下面是一些通过Proc查看和更改系统的例子:
获取可用系统内存的空间 :
grep Free /proc/meminfo
自从系统最后一次启动后的系统统计可以从/proc/stat文件中获取 :
grep processes /proc/stat
获知第 1、5和15分钟系统负载的平均值 :
awk `{print “1 min:/t” $1 “/n5 min:/t” $2 “/n15 min:/t” $3` /proc/loadavg
/proc/partitions可用于获取系统的分区信息 。
/proc/net和/proc/sys/net可用于查看和更改重要的网络信息。比如,禁用ping命令,可以以 root身份运行以下命令 :
echo 1>/proc/sys/net/ipv4/icmp_echo_ignore_all
如果要启用IP转发/IP伪装,使用以下命令 :
echo 1> /proc/sys/net/ipv4/ip_forward
已经挂载的文件系统信息可以从/proc/mounts中检索。
要改变正在使用的主机名 ,使用以下命令:
echo www.abc.corn >/proc/sys/kernel/hostname
要获取CPU信息,使用以下命令 :
cat /proc/cpuinfo
要获知swap空间的使用情况 ,使用以下命令:
cat /proc/swaps
获取系统的正常运行时间:
cat /proc/uptime
列出由NFS共享的文件系统:
cat /proc/fs/nfsd/exports
三、相关内核的信息
从正在运行的内核中获知内核的版本:
cat /proc/version
/proc/kmsg文件被作为内核日志信息源,它可以被作为一个系统信息调用的接口使用。
/proc/kcore文件提供了以内核文件格式形式访问系统物理内存,并且可以被gdb用于检查任意内核数据结构的当前状态。如果装了源码,那么可以通过查看/usr/src/linux/Documentation/filesystems/proc.txt文件来获取更多的信息 。
从中可以看出来,Proc是一个非常不错的获取系统信息渠道。如果利用得好,则它对Linux系统的维护和管理能提供非常大的帮助。
四、一个简单的用来排查CPU占用过高的应用程序的例子:
执行top
比如,第一行的mysqld,我要查看他的执行文件和打开了哪些文件,从图中可以看到对应的PID为29792
执行 ls -l /proc/29792
图中蓝色cwd表示该应用所在的路径,蓝色exe表示该执行文件名称与位置,蓝色fd目录内列出该应用打开了哪些文件