/proc目錄的作用,及利用/proc恢復刪除的文件
在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相對應。通過這些目錄,可以查看進程相關的信息。下面是一些常用的文件:
cmdline:保存了當前進程的啟動命令。如下是系統中運行的jenkins的啟動命令:
# 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
cwd:指向進程運行的目錄:
lrwxrwxrwx 1 jenkins jenkins 0 1月 10 15:09 cwd -> /
exe:指向啟動進程的可執行文件:
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
environ:包含與進程相關的環境變量:
# 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
fd:fd目錄包含了進程打開的每一個文件的文件描述符。這些描述符都指向實際文件:
# 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 ......
task:task目錄下包含了當前進程的每一個線程的相關信息,與進程運行時的相關文件一樣:
# ls task/ 12289 12291 13763 13766 2639 2641 2643 2647 2649 2651 ...
limits:保存了進程使用資源的限制信息,軟限制、硬限制及單位:
# 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命令查看該文件被哪個進程使用:
# 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
在/proc/2639/fd目錄下找到該文件的文件句柄:
# 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
重啟jenkins,是否能啟動成功:
# /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 ......
/proc目錄的作用,及利用/proc恢復刪除的文件