1. 程式人生 > 其它 >Linux刪除檔案後沒有釋放磁碟空間的幾種處理方式

Linux刪除檔案後沒有釋放磁碟空間的幾種處理方式

最近有個前同事的公司招人,給我內推了下,基於當前大環境,換工作的意願不是很強烈,但是還是想去看看機會。由於時間比較倉促,準備的不是很充分。面試的時候還是挺緊張的。面試過程還是挺順利的,最後面試關問了一個問題:linux系統下檔案被刪除之後,使用df命令檢視,磁碟空間卻沒有被釋放,怎麼排查?   我一聽,這個問題我遇到過啊,當時很有信心的回答到:是有程序仍在佔用被刪除的檔案,要想真正的刪除,只需要停止或重啟程序,釋放程序對檔案的佔用即可。 面試官又追問了一句,如果這個程式很重要,不能被停止,該怎麼處理。我當時就愣住了,之前處理問題的時候只想著解決問題了,根本沒想到拓展思考一下。一下把我問蒙了。   等面試完後,我查了下資料,才完全弄明白。現在分享出來。     原因就像我上面的回答那樣,在Linux或者Unix系統中,通過rm或者檔案管理器刪除檔案將會從檔案系統的目錄結構上解除連結(unlink)。然而如果檔案是被開啟的(有一個程序正在使用),那麼程序將仍然可以讀取該檔案,磁碟空間也一直被佔用。   一種解決方法是kill掉相應的程序,或者停掉使用這個檔案的應用,讓os自動回收磁碟空間。這種方法就像後面面試官追問的那樣,停掉或重啟應用風險較大。那麼還有什麼方法能解決嗎?   從更深一層次來看,當linux開啟一個檔案的時候,Linux核心會為每一個程序在/proc/ 『/proc/nnnn/fd/目錄(nnnn為pid)』建立一個以其pid為名的目錄用來儲存程序的相關資訊,而其子目錄fd儲存的是該程序開啟的所有檔案的fd(fd:file descriptor)。     當檔案被刪除後,從檔案目錄上已經看不到了,但是還可以使用lsof命令檢視到被刪除的檔案,及其佔用該檔案的程序   通過該程序,進入到對應的/proc/nnnn/fd/目錄,仍然可以找到對應的被刪除檔案   這裡就是關鍵了,可以使用 echo "" > file_name 命令將被刪除的檔案清空,直接緩解磁碟空間被佔用的問題,之後有更多時間來處理這個問題。 當然這個方法也可以用來恢復被誤刪除的檔案資料(僅限於被刪除檔案還被程序佔用沒有被完全釋放)。