{eval=Array;=+count(Array);}
當(dāng)進(jìn)程打開某個文件時,只要該進(jìn)程保持打開該文件,即使將其刪除,它依然存在于磁盤中。這意味著,進(jìn)程并不知道文件已經(jīng)被刪除,它仍然可以向打開該文件時提供給它的文件描述符進(jìn)行讀取和寫入。除了該進(jìn)程之外,這個文件是不可見的,因?yàn)橐呀?jīng)刪除了其相應(yīng)的目錄索引節(jié)點(diǎn)。在這種情況可以通過lsof來恢復(fù)這些文件。
在/proc目錄下,其中包含了反映內(nèi)核和進(jìn)程樹的各種文件。/proc目錄掛載的是在內(nèi)存中所映射的一塊區(qū)域,所以這些文件和目錄并不存在于磁盤中,因此當(dāng)我們對這些文件進(jìn)行讀取和寫入時,實(shí)際上是在從內(nèi)存中獲取相關(guān)信息。大多數(shù)與lsof相關(guān)的信息都存儲于以進(jìn)程的PID命名的目錄中,即/proc/12中包含的是PID為12的進(jìn)程的信息。每個進(jìn)程目錄中存在著各種文件,它們可以使應(yīng)用程序簡單地了解進(jìn)程的內(nèi)存空間、文件描述符列表、指向磁盤上的文件的符號鏈接和其他系統(tǒng)信息。lsof程序使用該信息和其他關(guān)于內(nèi)核內(nèi)部狀態(tài)的信息來產(chǎn)生其輸出。所以lsof可以顯示進(jìn)程的文件描述符和相關(guān)的文件名等信息。也就是我們通過訪問進(jìn)程的文件描述符可以找到該文件的相關(guān)信息。
下面舉例說明
我/tmp目錄下創(chuàng)建了腳本文件,時刻在后臺運(yùn)行,但是tmp目下會被系統(tǒng)定時刪除的,但犯懶不想重寫腳本,想把原來的找回,具體步驟如下。
1.查看已經(jīng)被刪除的文件diamon.sh,已經(jīng)不存在了
[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來查看當(dāng)前哪個進(jìn)程正在打開文件”/tmp/diamon.sh“
[root@centos5 ~]# lsof | grep diamon
sh 8455 root 255r REG 253,0 173 764298 /tmp/diamon.sh (deleted)
[root@centos5 ~]#
從上面的輸出可以看到,進(jìn)程8455正在以只讀的方式打開這個文件,打開的文件描述符為255,同時文件/tmp/diamon.sh被標(biāo)記刪除。然后我查看文件" /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. 已經(jīng)找到已經(jīng)被刪除的文件了嗎然后利用I/O重定向?qū)⑵浠謴?fù)到指定文件中,如下
[root@centos5 ~]# cat /proc/8455/fd/255 > /tmp/diamon.sh
檢查文件已經(jīng)被恢復(fù)了
[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 ~]#
查看恢復(fù)的文件內(nèi)容是否正常
[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恢復(fù)刪除文件成功結(jié)束
總結(jié):
A.在文件被刪除時,不要慌,盡可能保存現(xiàn)場
B.對于某些數(shù)據(jù)庫文件被誤刪除很有效
0
回答0
回答0
回答0
回答0
回答0
回答0
回答0
回答1
回答0
回答