在linux中,當我們使用rm在linux上刪除了大文件,但是如果有進程打開了這個大文件,卻沒有關閉這個文件的句柄,那么linux內核還是不會釋放這個文件的磁盤空間,最后造成磁盤空間占用100%,整個系統無法正常運行。這種情況下,通過df和du命令查找的磁盤空間,兩者是無法匹配的,可能df顯示磁盤100%,而du查找目錄的磁盤容量占用卻很小。
遇到這種情況,基本可以斷定是某些大文件被某些程序占用了,並且這些大文件已經被刪除了,但是對應的文件句柄沒有被某些程序關閉,造成內核無法回收這些文件占用的空間。
那么,如何查找那些文件被某些程序占用呢,命令如下
lsof -n | grep deleted
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
dd 31708 higkoo 1w REG 8,2 5523705856 429590 /data/filetest (deleted)
命令打lsof -n | grep deleted印出所有針對已刪除文件的讀寫操作,這類操作是無效的,也正是磁盤空間莫名消失的根本原因
備注:本人遇到的場景是同事刪除了mysql的表,但是是在shell上執行rm表的文件,而不是通過drop table之類的命令去刪除表的,於是mysql會一直占用這些表文件的句柄,最后造成磁盤空間100%,這種情況下,也不用重啟mysql,只要進入mysql客戶端執行flush tables就行了
參考資料 http://hi.baidu.com/higkoo/item/6a478917d1a819debf9042f1