4.5 监控proc目录
4.5.1 Linux系统的/proc目录介绍
Linux系统上的/proc目录是一种文件系统,即proc文件系统。与其它常见的文件系统不同的是,/proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态。
基于/proc文件系统如上所述的特殊性,其内的文件也常被称作虚拟文件,并具有一些独特的特点。例如,其中有些文件虽然使用查看命令查看时会返回大量信息,但文件本身的大小却会显示为0字节。此外,这些特殊文件中大多数文件的时间及日期属性通常为当前系统时间和日期,这跟它们随时会被刷新(存储于RAM中)有关。
为了查看及使用上的方便,这些文件通常会按照相关性进行分类存储于不同的目录甚至子目录中,如/proc/scsi目录中存储的就是当前系统上所有SCSI设备的相关信息,/proc/N中存储的则是系统当前正在运行的进程的相关信息,其中N为正在运行的进程(可以想象得到,在某进程结束后其相关目录则会消失)。
大多数虚拟文件可以使用文件查看命令如cat、more或者less进行查看,有些文件信息表述的内容可以一目了然,但也有文件的信息却不怎么具有可读性。不过,这些可读性较差的文件在使用一些命令如apm、free、lspci或top查看时却可以有着不错的表现。
4.5.2 proc目录下常用文件介绍
/proc目录中包含许多以数字命名的子目录,这些数字表示系统当前正在运行进程的进程号,里面包含对应进程相关的多个信息文件。每个目录中是当程本身相关信息的文件。
root@liu-ubuntu:~# ll /proc
总用量 4
dr-xr-xr-x 221 root root 0 6月 5 10:37 ./
drwxr-xr-x 24 root root 4096 6月 4 14:34 ../
dr-xr-xr-x 9 root root 0 6月 5 10:37 1/
dr-xr-xr-x 9 root root 0 6月 5 13:49 10/
dr-xr-xr-x 9 root root 0 6月 5 13:49 1000/
dr-xr-xr-x 9 liu liu 0 6月 5 10:37 1018/
dr-xr-xr-x 9 liu liu 0 6月 5 13:49 1019/
dr-xr-xr-x 9 liu liu 0 6月 5 13:49 1027/
dr-xr-xr-x 9 root root 0 6月 5 13:49 11/
dr-xr-xr-x 9 root root 0 6月 5 13:49 113/
dr-xr-xr-x 9 liu liu 0 6月 5 13:49 1190/
dr-xr-xr-x 9 liu liu 0 6月 5 13:49 1197/
dr-xr-xr-x 9 root root 0 6月 5 13:49 12/
。。。。。。
proc目录下常用文件有:
文件名 | 功能 |
---|---|
cmdline | 保存操作系统的启动参数 |
cpuinfo | 保存CPU的相关信息。对应lscpu命令。 |
devices | 系统已经加载的所有块设备和字符设备的信息。 |
diskstats | 统计磁盘设备的I/O信息。 |
filesystems | 保存当前系统支持的文件系统。 |
kcore | 物理内存的镜像。会显示文件大小,但不占用实际磁盘空间。该文件大小是已使用的物理内存加上4K。 |
loadavg | 保存最近1分钟、5分钟、15分钟的系统平均负载。 |
meminfo | 保存当前内存使用情况。对应free命令 |
mounts -> self/mounts | 系统中当前挂载的所有文件系统。mount命令。mounts文件是链接到self/mounts。 |
net/dev | 网络流量统计。接收、发送、发送时的错误和冲突情况。 |
partitions | 每个分区的主设备号(major)、次设备号(minor)、包含的块(block)数目。 |
uptime | 系统自上次启动后的运行时间。 |
version | 当前系统的内核版本号 |
vmstat | 当前系统虚拟内存的统计数据 |
4.5.3 进程目录下常用文件介绍
每个进程目录下常用文件有:
root@liu-ubuntu:~# ll /proc/1000
总用量 0
dr-xr-xr-x 9 root root 0 6月 5 13:49 ./
dr-xr-xr-x 221 root root 0 6月 5 10:37 ../
dr-xr-xr-x 2 root root 0 6月 5 14:02 attr/
-rw-r--r-- 1 root root 0 6月 5 14:02 autogroup
-r-------- 1 root root 0 6月 5 14:02 auxv
-r--r--r-- 1 root root 0 6月 5 14:02 cgroup
--w------- 1 root root 0 6月 5 14:02 clear_refs
-r--r--r-- 1 root root 0 6月 5 13:49 cmdline
-rw-r--r-- 1 root root 0 6月 5 14:02 comm
-rw-r--r-- 1 root root 0 6月 5 14:02 coredump_filter
-r--r--r-- 1 root root 0 6月 5 14:02 cpuset
lrwxrwxrwx 1 root root 0 6月 5 14:02 cwd -> //
。。。。。。
1、cmdline — 启动当前进程的完整命令,但僵尸进程目录中的此文件不包含任何信息;
2、cwd — 指向当前进程运行目录的一个符号链接;
3、environ — 当前进程的环境变量列表,彼此间用空字符(NULL)隔开;变量用大写字母表示,其值用小写字母表示;
4、exe — 指向启动当前进程的可执行文件(完整路径)的符号链接,通过/proc/N/exe可以启动当前进程的一个拷贝;
5、fd — 这是个目录,包含当前进程打开的每一个文件的文件描述符(file descriptor),这些文件描述符是指向实际文件的一个符号链接;
6、limits — 当前进程所使用的每一个受限资源的软限制、硬限制和管理单元;此文件仅可由实际启动当前进程的UID用户读取;(2.6.24以后的内核版本支持此功能);
7、maps — 当前进程关联到的每个可执行文件和库文件在内存中的映射区域及其访问权限所组成的列表;
8、mem — 当前进程所占用的内存空间,由open、read和lseek等系统调用使用,不能被用户读取;
9、root — 指向当前进程运行根目录的符号链接;在Unix和Linux系统上,通常采用chroot命令使每个进程运行于独立的根目录;
10、stat — 当前进程的状态信息,包含一系统格式化后的数据列,可读性差,通常由ps命令使用;
11、statm — 当前进程占用内存的状态信息,通常以“页面”(page)表示;
12、status — 与stat所提供信息类似,但可读性较好,每行表示一个属性信息;
13、task — 目录文件,包含由当前进程所运行的每一个线程的相关信息,每个线程的相关信息文件均保存在一个由线程号(tid)命名的目录中,这类似于其内容类似于每个进程目录中的内容;(内核2.6版本以后支持此功能)
4.5.4 利用/proc目录找到被删除的文件
当进程打开了某个文件时,只要该进程保持打开该文件,即使将其删除,它依然存在于磁盘中。这意味着,进程并不知道文件已经被删除,它仍然可以向打开该文件时提供给它的文件描述符进行读取和写入。除了该进程之外,这个文件是不可见的,因为已经删除了其相应的目录索引节点。proc文件系统可以协助我们恢复数据。每一个系统上的进程在/proc都有一个目录和自己的名字,里面包含了一个fd(文件描述符)子目录(进程需要打开文件的所有链接)。如果从文件系统中删除一个文件,此处还有一个inode的引用。
首先使用lsof命令查看该文件被哪个进程使用,然后在/proc/进程ID/fd目录下找到该文件的文件句柄,直接将此文件恢复即可。使用的命令有:
使用lsof命令查看该文件被哪个进程使用:
lsof | grep '文件名'
在/proc/进程ID/fd目录下找到该文件的文件句柄
ls -l | grep '文件名'
恢复这个文件:
/proc/进程ID/fd/句柄号