Linux 磁碟空間排查與清理標準作業流程 (SOP)
階段一:快速定位受影響磁碟分割區 (Filesystem)
Bash
# 1. 檢視各磁碟掛載點空間使用率 (以人類可讀單位顯示)
df -h
# 2. 檢查 Inode 使用率 (避免容量未滿但 Inode 耗盡導致無法寫入)
df -i
階段二:由大到小逐層定位目錄與檔案 (Drill-Down)
1. 檢查根目錄或特定目錄下各子目錄大小
Bash
# 檢查第一層目錄容量並排序 (排除 proc/sys 等虛擬檔案系統報錯)
du -h --max-depth=1 / 2>/dev/null | sort -hr | head -n 20
# 包含隱藏目錄/檔案 (適用於家目錄排查,如 /home/user)
du -sh /home/tomcat/{.[!.],}* 2>/dev/null | sort -hr | head -n 15
2. 跨層級搜尋超大檔案 (Top Large Files)
Bash
# 列出指定目錄下最大的前 10 個檔案
find /path/to/target -type f -exec du -h {} + 2>/dev/null | sort -hr | head -n 10
# 搜尋大於 500MB 或 1GB 的單一檔案
find / -type f -size +500M -exec ls -lh {} + 2>/dev/null
階段三:常見高佔用項目清理語法
1. 應用程式快取與依賴套件
-
NPM Cache:
Bash# 透過 npm 工具清空 npm cache clean --force # 若無指令或強制刪除實體檔案 rm -rf ~/.npm/_cacache/* -
Yarn / Pnpm Cache:
Bashyarn cache clean pnpm store prune
2. 日誌檔案 (Logs)
重要原則:運作中的服務日誌切勿直接rm,否則因 Process 持有 File Descriptor,磁碟空間不會釋放(見階段五)。應使用truncate清空內容。
-
PM2 Logs:
Bashpm2 flush -
傳統 Application / Nginx / Tomcat 日誌:
Bash# 將日誌內容清空為 0-byte (安全作法) truncate -s 0 /path/to/logfile.log # 或使用 shell 重導向 : > /path/to/logfile.log -
Systemd Journal 日誌:
Bash# 僅保留最近 7 天的 journal journalctl --vacuum-time=7d # 或限制 journal 總量上限在 500MB journalctl --vacuum-size=500M
3. 容器與 CI/CD 建置暫存 (Docker / GitLab Runner)
-
Docker 清理:
Bash# 清理停止的容器、未使用的網路與 Dangling 映像檔 docker system prune -f # 深度清理:包含未使用的 Volumes 與 Build Cache docker system prune -a --volumes -f # 單獨清理 Buildx 建置快取 docker builder prune -a -f -
GitLab Runner 快取:
Bash# 清空 runner 的 builds 與 cache 目錄 rm -rf /home/gitlab-runner/cache/* rm -rf /home/gitlab-runner/builds/*
4. 系統套件庫快取 (OS Package Manager)
-
Debian / Ubuntu (APT):
Bashsudo apt-get clean sudo apt-get autoremove -y -
RHEL / CentOS / Rocky Linux (YUM / DNF):
Bashsudo dnf clean all # 或 sudo yum clean all
階段四:清理命令誤觸留下的異常檔案 (0-Byte 殘留)
常見於
curl 或 wget 語法錯誤時產生的 HTTP Header 檔名:Bash
rm -f ./Accept: ./GET ./Host: ./User-Agent: ./--header
階段五:特殊狀況排查(刪了檔案空間卻未釋放)
若
rm 刪除大檔後 df -h 空間依然未釋放,表示該檔案仍被運行中的行程開啟中(Deleted Handle)。Bash
# 1. 查詢處於 deleted 狀態但被行程佔用的檔案
lsof +L1
# 或
lsof | grep '(deleted)'
# 2. 解決方式:
# A. 重啟持有該檔案的服務 (最佳實踐)
systemctl restart <service_name>
# B. 若無法中斷服務,直接對該 Process 的 File Descriptor 進行清空
# 假設 PID 為 12345,FD 為 3
: > /proc/12345/fd/3
階段六:驗證結果
Bash
# 再次檢視掛載點容量是否下降
df -h
# 驗證特定目錄清理後的容量
du -sh /path/to/target