天天看點

不小心執行 rm -f,先别着急跑路

作者:justmine

www.cnblogs.com/justmine/p/10359186.html

不小心執行 rm -f,先别着急跑路

前言

每當我們在生産環境伺服器上執行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
           
不小心執行 rm -f,先别着急跑路

從上面可以看出,目前檔案狀态為已删除(deleted)。

(2)、檢視是否存在恢複資料:

/proc/13067/fd:程序操作的檔案描述符目錄。

86:檔案描述符。

> cat /proc/13067/fd/86
           
不小心執行 rm -f,先别着急跑路

(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
           

重新運作程式:

不小心執行 rm -f,先别着急跑路

說明恢複的檔案沒有問題。

刨根問底

通過前面的模拟場景示範了恢複檔案的整個過程,那麼原理是什麼,在什麼情況下,檔案才是可恢複的。

在Linux系統中,每個運作中的程式都有一個宿主程序彼此隔離,以/proc/程序号來展現(Linux本質上就是一個檔案系統),比如:ls -l /proc/13067 檢視程序PID為13067的程序資訊;當程式運作時,作業系統會專門開辟一塊記憶體區域,提供給目前程序使用,對于依賴的檔案,作業系統會發放一個檔案描述符,以便讀寫檔案,當我們執行 rm -f 删除檔案時,其實隻是删除了檔案的目錄索引節點,對于檔案系統不可見,但是對于打開它的程序依然可見,即仍然可以使用先前發放的檔案描述符讀寫檔案,正是利用這樣的原理,是以我們可以使用I/O重定向的方式來恢複檔案。

總結

如果不小心誤删了檔案,不要着急,首先使用 lsof 檢視打開該檔案的程序,然後再使用 cat /proc/程序号/fd/檔案描述符 檢視恢複資料,最後使用I/O重定向的方式來恢複檔案。

精選文章

Java 全套學習資料分享

Mac 超詳細入門指南,收藏了!

漫畫:IT人的大閱兵,十分精彩!

漫畫:程式員真是太太太太太有趣了!

不小心執行 rm -f,先别着急跑路

(程式IT圈)

如果有幫助,請點個“在看”支援!