liunx誤刪文件回覆方式

linux恢復意外刪除的文件

 

當進程打開某個文件時,只要該進程保持打開該文件,即使將其刪除,它依然存在於磁盤中。這意味着,進程並不知道文件已經被刪除,它仍然可以向打開該文件時提供給它的文件描述符進行讀取和寫入。除了該進程之外,這個文件是不可見的,因爲已經刪除了其相應的目錄索引節點。在這種情況可以通過lsof來恢復這些文件。

在/proc目錄下,其中包含了反映內核和進程樹的各種文件。/proc目錄掛載的是在內存中所映射的一塊區域,所以這些文件和目錄並不存在於磁盤中,因此當我們對這些文件進行讀取和寫入時,實際上是在從內存中獲取相關信息。大多數與lsof相關的信息都存儲於以進程的PID命名的目錄中,即/proc/12中包含的是PID爲12的進程的信息。每個進程目錄中存在着各種文件,它們可以使應用程序簡單地瞭解進程的內存空間、文件描述符列表、指向磁盤上的文件的符號鏈接和其他系統信息。lsof程序使用該信息和其他關於內核內部狀態的信息來產生其輸出。所以lsof可以顯示進程的文件描述符和相關的文件名等信息。也就是我們通過訪問進程的文件描述符可以找到該文件的相關信息。

下面舉例說明

我/tmp目錄下創建了腳本文件,時刻在後臺運行,但是tmp目下會被系統定時刪除的,但犯懶不想重寫腳本,想把原來的找回,具體步驟如下。

 

1.查看已經被刪除的文件diamon.sh,已經不存在了

[root@centos5 ~]# ll /tmp/
total 28
-rw-r--r-- 1 root  root   402 Sep 26 14:19 load_tab.sh
srwxrwxrwx 1 mysql mysql    0 Sep 16 15:20 mysql.sock
drwx------ 2 root  root  4096 Oct 12 15:44 ssh-hiPBw10887
drwx------ 2 root  root  4096 Oct 10 16:12 ssh-lUXbjf6337

 

2. 使用lsof來查看當前哪個進程正在打開文件”/tmp/diamon.sh“
[root@centos5 ~]# lsof | grep diamon
sh         8455      root  255r      REG              253,0        173               764298 /tmp/diamon.sh (deleted)
[root@centos5 ~]#

 

從上面的輸出可以看到,進程8455正在以只讀的方式打開這個文件,打開的文件描述符爲255,同時文件/tmp/diamon.sh被標記刪除。然後我查看文件" /proc/8455/fd/255"

 

[root@centos5 ~]# more /proc/8455/fd/255
#variables
dir=/tmp

while (true)
do
v_num=`ps -ef | grep load_tab | grep -v grep | wc -l`
 
if [ $v_num -lt 4 ] ; then
  sh /tmp/load_tab.sh > /dev/null 2>&1 &
fi
done
[root@centos5 ~]#

 

3. 已經找到已經被刪除的文件了嗎然後利用I/O重定向將其恢復到指定文件中,如下

[root@centos5 ~]# cat /proc/8455/fd/255 > /tmp/diamon.sh

 

檢查文件已經被恢復了
[root@centos5 ~]# ll /tmp
total 36
-rw-r--r-- 1 root  root   173 Oct 12 16:53 diamon.sh
-rw-r--r-- 1 root  root   402 Sep 26 14:19 load_test10.sh
srwxrwxrwx 1 mysql mysql    0 Sep 16 15:20 mysql.sock
drwx------ 2 root  root  4096 Oct 12 15:44 ssh-hiPBw10887
drwx------ 2 root  root  4096 Oct 10 16:12 ssh-lUXbjf6337
[root@centos5 ~]#

 

查看恢復的文件內容是否正常
[root@centos5 ~]# 
[root@centos5 ~]# more /tmp/diamon.sh 
#variables
dir=/tmp

while (true)
do
v_num=`ps -ef | grep load_test | grep -v grep | wc -l`
 
if [ $v_num -lt 4 ] ; then
  sh /tmp/load_test10.sh > /dev/null 2>&1 &
fi
done
[root@centos5 ~]#

至此linux恢復刪除文件成功結束


總結:
A.在文件被刪除時,不要慌,儘可能保存現場
B.對於某些數據庫文件被誤刪除很有效

 

 

---end----

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章