Linux中多進(jìn)程環(huán)境下,打開(kāi)同一個(gè)文件,當(dāng)一個(gè)進(jìn)程進(jìn)行讀寫(xiě)操作,如果另外一個(gè)進(jìn)程刪除了這個(gè)文件,那么讀寫(xiě)該文件的進(jìn)程會(huì)發(fā)生什么呢?
- 因?yàn)槲募粍h除了,讀寫(xiě)進(jìn)程發(fā)生異常?
- 正在讀寫(xiě)的進(jìn)程仍然正常讀寫(xiě),好像沒(méi)有發(fā)生什么?
學(xué)操作系統(tǒng)原理的時(shí)候,我們知道,linux是通過(guò)link的數(shù)量來(lái)控制文件刪除,只有當(dāng)一個(gè)文件不存在任何link的時(shí)候,這個(gè)文件才會(huì)被刪除。
而每個(gè)文件都會(huì)有2個(gè)link計(jì)數(shù)器-- i_count 和 i_nlink。i_count的意義是當(dāng)前使用者的數(shù)量,也就是打開(kāi)文件進(jìn)程的個(gè)數(shù)。i_nlink的意義是介質(zhì)連接的數(shù)量;或者可以理解為 i_count是內(nèi)存引用計(jì)數(shù)器,i_nlink是硬盤(pán)引用計(jì)數(shù)器。再換句話說(shuō),當(dāng)文件被某個(gè)進(jìn)程引用時(shí),i_count 就會(huì)增加;當(dāng)創(chuàng)建文件的硬連接的時(shí)候,i_nlink 就會(huì)增加。
對(duì)于 rm 而言,就是減少 i_nlink。這里就出現(xiàn)一個(gè)問(wèn)題,如果一個(gè)文件正在被某個(gè)進(jìn)程調(diào)用,而用戶(hù)卻執(zhí)行 rm 操作把文件刪除了,會(huì)出現(xiàn)什么結(jié)果呢?
當(dāng)用戶(hù)執(zhí)行 rm 操作后,ls 或者其他文件管理命令不再能夠找到這個(gè)文件,但是進(jìn)程卻依然在繼續(xù)正常執(zhí)行,依然能夠從文件中正確的讀取內(nèi)容。這是因?yàn)椋瑀m 操作只是將 i_nlink 置為 0 了;由于文件被進(jìn)程引用的緣故,i_count 不為 0,所以系統(tǒng)沒(méi)有真正刪除這個(gè)文件。i_nlink 是文件刪除的充分條件,而 i_count 才是文件刪除的必要條件。
基于以上只是,大家猜一下,如果在一個(gè)進(jìn)程在打開(kāi)文件寫(xiě)日志的時(shí)候,手動(dòng)或者另外一個(gè)進(jìn)程將這個(gè)日志刪除,會(huì)發(fā)生什么情況?
是的,數(shù)據(jù)庫(kù)并沒(méi)有停掉。雖然日志文件被刪除了,但是有一個(gè)進(jìn)程已經(jīng)打開(kāi)了那個(gè)文件,所以向那個(gè)文件中的寫(xiě)操作仍然會(huì)成功,數(shù)據(jù)仍然會(huì)提交。
下面,告訴大家如何恢復(fù)那個(gè)刪除的文件。
例如,你刪除了tcpdump.log,執(zhí)行l(wèi)sof | grep tcpdump.log,你應(yīng)該能看到這樣的輸出:
tcpdump 2864 tcpdump 4w REG 253,0 0 671457 /root/tcpdump.log (deleted)
然后:
cp /proc/2864/fd/4 /root/tcpdump.log