作者:justmine
www.cnblogs.com/justmine/p/10359186.html
前言
每當我們在生産環境伺服器上執行rm指令時,總是提心吊膽的,因為一不小心執行了誤删,然後就要準備跑路了,畢竟人不是機器,更何況機器也有 bug,呵呵。
那麼如果真的删除了不該删除的檔案,比如資料庫、日志或執行檔案,咋辦呢?欲知後事如何,請仔細看完本篇部落格。
模拟場景
1、删除
誤删除伺服器目錄/root/selenium/Spider下的MySql.Data.dll檔案:
> rm -f /root/selenium/Spider/MySql.Data.dll
> ll /root/selenium/Spider/MySql.Data.dll
ls: cannot access /root/selenium/Spider/MySql.Data.dll: No such file or directory
2、恢複
(1)、使用 lsof 指令檢視目前是否有程序打開 /root/selenium/Spider/MySql.Data.dll檔案:
> lsof | grep /root/selenium/Spider/MySql.Data.dll
從上面可以看出,目前檔案狀态為已删除(deleted)。
(2)、檢視是否存在恢複資料:
/proc/13067/fd:程序操作的檔案描述符目錄。
86:檔案描述符。
> cat /proc/13067/fd/86
(3)、使用I/O重定向恢複檔案
> cat /proc/23778/fd/86 > /root/selenium/Spider/MySql.Data.dll
> ls -l /root/selenium/Spider/MySql.Data.dll
-rw-r--r-- 1 root root 702464 Feb 10 12:03 /root/selenium/Spider/MySql.Data.dll
重新運作程式:
說明恢複的檔案沒有問題。
刨根問底
通過前面的模拟場景示範了恢複檔案的整個過程,那麼原理是什麼,在什麼情況下,檔案才是可恢複的。
在Linux系統中,每個運作中的程式都有一個宿主程序彼此隔離,以/proc/程序号來展現(Linux本質上就是一個檔案系統),比如:ls -l /proc/13067 檢視程序PID為13067的程序資訊;當程式運作時,作業系統會專門開辟一塊記憶體區域,提供給目前程序使用,對于依賴的檔案,作業系統會發放一個檔案描述符,以便讀寫檔案,當我們執行 rm -f 删除檔案時,其實隻是删除了檔案的目錄索引節點,對于檔案系統不可見,但是對于打開它的程序依然可見,即仍然可以使用先前發放的檔案描述符讀寫檔案,正是利用這樣的原理,是以我們可以使用I/O重定向的方式來恢複檔案。
總結
如果不小心誤删了檔案,不要着急,首先使用 lsof 檢視打開該檔案的程序,然後再使用 cat /proc/程序号/fd/檔案描述符 檢視恢複資料,最後使用I/O重定向的方式來恢複檔案。
精選文章
Java 全套學習資料分享
Mac 超詳細入門指南,收藏了!
漫畫:IT人的大閱兵,十分精彩!
漫畫:程式員真是太太太太太有趣了!
(程式IT圈)
如果有幫助,請點個“在看”支援!