1. 程式人生 > >/proc目錄的作用,及利用/proc恢復刪除的文件

/proc目錄的作用,及利用/proc恢復刪除的文件

通過 start lsof命令 查看進程 disk nds 是否 數字 row

介紹:

在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恢復刪除的文件