1. 程式人生 > >LINUX下刪除檔案磁碟空間不釋放的原因

LINUX下刪除檔案磁碟空間不釋放的原因

這幾天做LINUX實驗的時候,發覺自己刪除了一個大檔案後用  df -h 指令檢測磁碟空間,發現空間並沒有減少,後來仔細查詢,總結出以下三種不釋放記憶體的可能:

一、該檔案已經建立硬連結

這個原因很簡單,hardlink是指多個檔名指向同一索引點(inode),只要其中仍然存在一個硬連結都檔案記憶體都不會釋放,所以檔案具有硬連結是原因之一。

二、系統中有程序正在使用該檔案

這個原因解釋起來也很簡單,如果系統中有程序使用該檔案,刪除該檔案後如果記憶體釋放,則程序會自動結束,造成無法預測的後果。

這裡給出一種解決方案:

1、用 lsof | grep deleted命令列出現在被刪除但依舊使用的檔案

2、這裡我可以用kill命令殺掉這個程序,但是請注意,如果當前系統有多個程序正在使用該檔案,則停掉會有風險,所以建議先停掉這個程序。

PS:lsof這個命令非常好用這裡給大家簡單介紹一下:

lsof(list open files)是一個列出當前系統開啟檔案的工具。在linux環境下,任何事物都以檔案的形式存在,通過檔案不僅僅可以訪問常規資料,還可以訪問網路連線和硬體。所以如傳輸控制協議 (TCP) 和使用者資料報協議 (UDP) 套接字等,系統在後臺都為該應用程式分配了一個檔案描述符,無論這個檔案的本質如何,該檔案描述符為應用程式與基礎作業系統之間的互動提供了通用介面。因為應用程式開啟檔案的描述符列表提供了大量關於這個應用程式本身的資訊,因此通過lsof工具能夠檢視這個列表對系統監測以及排錯將是很有幫助的。


在終端下輸入lsof即可顯示系統開啟的檔案,因為 lsof 需要訪問核心記憶體和各種檔案,所以必須以 root 使用者的身份執行它才能夠充分地發揮其功能。

lisof有很多命令,這裡舉幾個例子簡要介紹一下,

lsof abc.txt 顯示開啟檔案abc.txt的程序
lsof -c abc 顯示abc程序現在開啟的檔案
lsof -c -p 1234 列出程序號為1234的程序所開啟的檔案
lsof -g gid 顯示歸屬gid的程序情況
lsof +d /usr/local/ 顯示目錄下被程序開啟的檔案
lsof +D /usr/local/ 同上,但是會搜尋目錄下的目錄,時間較長
lsof -d 4 顯示使用fd為4的程序
lsof -i 用以顯示符合條件的程序情況
lsof -i[46] [protocol][@hostname|hostaddr][:service|port]
--> IPv4 or IPv6
  protocol --> TCP or UDP
  hostname --> Internet host name
  hostaddr --> IPv4地址
  service --> /etc/service中的 service name (可以不止一個)
  port --> 埠號 (可以不止一個)


、磁碟空餘空間出現問題

這個問題原因就很複雜了,既有物理磁碟損壞又有些磁碟內部分配問題。

這裡提供一個可能,大家都知道LINUX檔案系統是通過inode索引檔案管理blocks區域,如果檔案中的inode節點被用完了,則無法分配新空間。