Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學

Linux 磁碟空間釋放謎題:刪除檔案後 df 未回空間,lsof 找出佔用進程並恢復

編輯:Linux 系統常見問題解答

現象描述

Zabbix 告警 /home 使用率超過 90%,發現 MongoDB 資料檔佔用大量空間。刪除 MongoDB 資料檔後,df -h 顯示空間未釋放,甚至使用率上升至 96%,但 du -sh /home 顯示實際使用量很低。

根因分析:檔案描述符未釋放

Linux 中,刪除檔案 (unlink) 僅移除目錄項目,若有進程仍持有該檔案的開啟描述符,資料塊不會真正釋放。空間會在進程關閉檔案或結束後才歸還給檔案系統。

排查步驟

  1. 使用 lsof 找出已刪除但仍被持有的檔案:
lsof | grep deleted

輸出範例:

mongod  1234  mongodb  4u   REG  253,0  1073741824  12 /home/mongodb/data.0 (deleted)
  1. 確認佔用進程 (PID 1234 為 mongod)
  2. 重啟該服務釋放描述符:
systemctl restart mongod
# 或
service mongod restart
  1. 再次檢查 df -h,空間已恢復正常。

補充:無法重啟服務時的替代方案

若服務不可重啟,可透過 /proc 檔案系統強制關閉檔案描述符 (謹慎操作):

# 找到檔案描述符編號 (如上例為 4)
ls -l /proc/1234/fd/ | grep deleted

# 強制關閉 (需 root,極度危險,可能導致進程崩潰)
# echo > /proc/1234/fd/4   # 不推薦生產環境使用

預防與監控建議

  • 監控系統加入 lsof | grep deleted 定期檢查
  • 刪除大型日誌/資料檔前,先確認無進程持有 (fuser filename)
  • 使用 logrotate 管理日誌輪轉,避免手動刪除導致描述符殘留
  • 資料庫備份/清理操作建議在維護窗口進行,協同重啟服務

核心概念總結

指令統計範圍受「已刪除但開啟」檔案影響
df檔案系統區塊使用量✅ 是 (空間未釋放)
du目錄樹下實際檔案大小❌ 否 (已從目錄移除)
lsof進程開啟的檔案描述符✅ 可見 (標記 deleted)
Copyright © Windows教程網 All Rights Reserved