萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

Linux 刪除大檔案後磁碟空間未釋放:lsof 找出佔用進程並重啟服務釋放空間

刪除大檔案 (如日誌) 後 df -h 空間未回升,因檔案仍被進程開啟,inode 未釋放。本文示範用 lsof 定位佔用進程、重啟服務釋放空間的完整排查流程。

現象重現

df -h   # /var 98% 滿
du -sh /var/*  # 發現 account/ 佔 3.3G
rm -rf /var/account/*
df -h   # 仍 98%,du 顯示 120K

排查步驟

  1. 用 lsof 找出已刪除但仍開啟的檔案:
    lsof | grep -i deleted
    # 輸出範例:
    # Billing_P 16989 blty 0u CHR 136,0 2 /dev/pts/0 (deleted)
  2. 嘗試重啟相關服務:
    # 找到進程屬於 billing 服務
    /etc/init.d/billing restart
    # 若無效,嘗試重啟管理該檔案的 daemon (如 psacct)
  3. 重啟 psacct 服務 (本例關鍵):
    /etc/init.d/psacct restart
    # df -h 顯示 /var 釋放至 4%

原理說明

Linux 檔案被開啟時,刪除僅移除目錄項 (unlink),inode 與資料區塊保留直到**最後一個開啟該檔案的進程關閉檔案描述符**。lsof 顯示 (deleted) 標記即為此狀態。

最佳實踐建議

  • 刪除大檔前先 lsof | grep deleted 確認無進程佔用。
  • 若必須刪除,優先重啟相關服務再刪除,或使用 truncate -s 0 file 清空內容保留 inode。
  • 設定日誌輪轉 (logrotate) 避免單一檔案過大。
  • 允許停機時,可 umount 分區再掛載強制釋放 (極端手段)。

copyright © 萬盛學電腦網 all rights reserved