總結的原因:
1、刪除文件文件后沒有清空回收站;
2、刪除的文件不在系統分區,在其他分區上;
3、刪除的文件被保留在了/tmp分區下,而/tmp分區不是獨立的分區,是在根分區/的基礎上划分出來的分區;
4、刪除文件的進程delete一直在后台運行,仍然無法對該文件進行讀寫
常用指令總結:
du -h --max-depth=1 查看目錄深度為1的目錄或文件所占空間大小
lsof |grep deleted 獲得一個已經被刪除但是仍然被應用程序占用的文件列表
df -hl 查看文件系統所占磁盤空間大小
kill 9 pid-num 殺掉對應的進程
使用lsof /home | grep -i delete查找刪除的文件,但句柄未釋放的一大堆,而且目錄都是/xxx/index,直接指向solr離線索引項目。做 solr離線索引的時候,使用了FileUtils.delete()操作,有2個地方,一個是在inform中,core重啟的時候;一個是在 handle方法中,那時候是想同步索引時失敗回滾,確保舊的索引文件全部刪除,就是這里刪除了句柄未釋放的文件,造成磁盤滿了。
另:由上面的查詢結果我們可以看到,已經刪除的Java日志文件占用了很大的空間。
主要是因為我們在刪除這個日志文件的時候是用rm -rf *.log這樣的命令刪除的,刪除日志之后又沒有重啟java進程,導致inode節點不被釋放,空間一直被占用。
有些刪了文件,但是進程沒 reload,那些空間還是占用的,你可以理解為類似 windows 下的進程句柄沒釋放的概念吧~ 只是 windows 下如果有文件被進程使用,你一般是刪不掉的,而 Linux 雖然不做刪除限制,但卻要等到進程使用完文件才能完全釋放,以防止進程奔潰,這是操作系統對資源的管理差異吧~