介绍:
在Linux系统中,/proc目录是一个位于内存中的伪文件系统。该目录下保存的不是真正的文件和目录,而是一些“运行时”的信息,如CPU信息、负载信息、系统内存信息、磁盘io信息等。
通过ls -lh命令查看该目录下的文件,会发现几乎所有的文件大小都是0。但是仍然可以通过vim、cat、less、more等命令查看文件的内容。
/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 | 当前系统虚拟内存的统计数据 |
更多其他文件的介绍,可以通过man proc命令查看。
进程目录:
/proc目录下有很多以数字命名的目录,这些目录与进程的pid相对应。通过这些目录,可以查看进程相关的信息。下面是一些常用的文件:
# cat cmdline
/etc/alternatives/java-Dcom.sun.akuma.Daemon=daemonized-Djava.awt.headless=true-DJENKINS_HOME=/var/lib/jenkins-jar/usr/lib/jenkins/jenkins.war--logfile=/var/log/jenkins/jenkins.log--webroot=/var/cache/jenkins/war--daemon--httpPort=8080--debug=5--handlerCountMax=100--handlerCountMaxIdle=20
lrwxrwxrwx 1 jenkins jenkins 0 1月 10 15:09 cwd -> /
lrwxrwxrwx 1 jenkins jenkins 0 1月 10 15:09 exe -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.131-0.b11.el6_9.x86_64/jre/bin/java
# cat environ
SHELL=/bin/bashTERM=linuxUSER=jenkinsPATH=/sbin:/usr/sbin:/bin:/usr/binrunlevel=5RUNLEVEL=5LANGSH_SOURCED=1PWD=/LANG=en_US.UTF-8previous=NPREVLEVEL=NCONSOLETYPE=vtHOME=/home/jenkinsSHLVL=3UPSTART_INSTANCE=LOGNAME=jenkinsUPSTART_EVENTS=runlevelUPSTART_JOB=rc_=/etc/alternatives/javaNLSPATH=/usr/dt/lib/nls/msg/%L/%N.catXFILESEARCHPATH=/usr/dt/app-defaults/%L/Dt
# ls -l
总用量 0
l-wx------ 1 jenkins jenkins 64 1月 8 14:06 0 -> /dev/null
l-wx------ 1 jenkins jenkins 64 1月 8 14:06 1 -> /dev/null
lr-x------ 1 jenkins jenkins 64 1月 8 14:06 10 -> /dev/urandom
lr-x------ 1 jenkins jenkins 64 1月 8 14:06 100 -> /var/cache/jenkins/war/WEB-INF/lib/akuma-1.10.jar
lr-x------ 1 jenkins jenkins 64 1月 8 14:06 101 -> /var/cache/jenkins/war/WEB-INF/lib/asm-analysis-5.0.3.jar
......
# ls task/
12289 12291 13763 13766 2639 2641 2643 2647 2649 2651 ...
# cat limits
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
利用/proc目录找到被删除的文件:
当前系统有jenkins正在运行,误删除了/var/cache/jenkins/war/WEB-INF/lib/akuma-1.10.jar文件。误删除的文件可能导致jenkins重启失败,或者导致某些功能失效。
在Linux系统中,如果删除了一个较大的文件。虽然在文件系统中找不到该文件,但是用df命令查看时,发现磁盘空间并没有因为文件的删除而增大。很有可能是因为某个进程正在使用该文件,执行删除命令不会马上删除该文件,占用的磁盘空间也不会被立即释放。
现在尝试使用/proc目录恢复删除的文件:
# lsof | grep 'akuma-1.10.jar'
java 2639 jenkins mem REG 8,5 19673 11928812 /var/cache/jenkins/war/WEB-INF/lib/akuma-1.10.jar
java 2639 jenkins 100r REG 8,5 19673 11928812 /var/cache/jenkins/war/WEB-INF/lib/akuma-1.10.jar
# ls -l | grep akuma
lr-x------ 1 jenkins jenkins 64 1月 8 14:06 100 -> /var/cache/jenkins/war/WEB-INF/lib/akuma-1.10.jar (deleted)
# cp /proc/2639/fd/100 /var/cache/jenkins/war/WEB-INF/lib/akuma-1.10.jar
# chown jenkins:jenkins /var/cache/jenkins/war/WEB-INF/lib/akuma-1.10.jar
# /etc/init.d/jenkins restart
Shutting down Jenkins [确定]
Starting Jenkins [确定]
# ps -ef | grep -v grep | grep jenkins
jenkins 21001 1 99 16:22 ? 00:00:17 /etc/alternatives/java -Dcom.sun.akuma.Daemon=daemonized ......