伺服器磁碟告警時,需快速定位佔用空間的大檔案/目錄並安全清理。本文提供從發現到清理的標準化指令工具箱。
# 找出 /data 目錄下超過 100MB 的檔案,顯示詳細資訊
find /data -type f -size +100M -exec ls -lh {} \;
# 找出全系統超過 500MB 的檔案(排除 /proc、/sys、/dev)
find / -type f -size +500M -not -path "/proc/*" -not -path "/sys/*" -not -path "/dev/*" -exec ls -lh {} \;
# 當前目錄下一級子目錄大小,按人類可讀格式倒序顯示前 10
du -h --max-depth=1 | sort -hr | head -10
# 僅顯示前 5 大目錄(數值排序,單位 MB)
du -m --max-depth=1 | sort -nr | head -5
# 清空單一檔案
> /var/log/nginx/access.log
# 或
: > /var/log/nginx/access.log
# 或
truncate -s 0 /var/log/nginx/access.log
# 批次清空某目錄下所有 .log
find /var/log -name "*.log" -exec truncate -s 0 {} \;
原理:截斷檔案大小為 0,釋放資料塊,但檔案描述符、inode、權限保持不變,寫入進程無感知,避免需重啟服務。
# 刪除 /var/mail 下超過 50MB 的檔案
find /var/mail -type f -size +50M -exec rm -f {} \;
# 刪除前先確認無進程開啟(lsof)
lsof /var/mail/large_file.mail
# 若有進程持有,需先停止服務或用 `> file` 清空而非刪除
現象:df -h 顯示磁碟滿,但 du -sh / 顯示佔用少,差值即為「已刪除開啟檔案」佔用的塊。
# 找出持有已刪除檔案的進程
lsof -nP | grep '(deleted)'
# 例:發現 pid 1234 持有 /var/log/messages (deleted)
# 方案一:優雅重啟該服務(systemctl reload rsyslog)
# 方案二:強制釋放(僅限無法重啟時)
# 進入 /proc/1234/fd/,找到對應 fd,執行 > /proc/1234/fd/N
# /etc/logrotate.d/custom-app
/var/log/myapp/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 640 www www
sharedscripts
postrotate
systemctl reload myapp > /dev/null 2>&1 || true
endscript
}
| 需求 | 指令 |
|---|---|
| 找大檔 | find /path -type f -size +100M -exec ls -lh {} \; |
| 目錄大小排序 | du -h --max-depth=1 | sort -hr |
| 清空檔案 | > file / truncate -s 0 file |
| 刪除大檔 | find /path -type f -size +50M -delete |
| 查已刪未釋放 | lsof -nP | grep deleted |
Linux 核心外設 I/O 內存映射機制:動態 ioremap 與靜態 map_desc 完整對比
Linux Shell 腳本入門教程(一):語法基礎與核心結構
Linux 遠端喚醒 (Wake-on-LAN) 設定與實作教學
RHEL/CentOS 6.x 系統服務完整指南:最小化安裝後的服務優化建議
Linux 強制定期更改密碼策略:login.defs、useradd 預設值與 chage 實務操作
Linux VI 編輯器完全入門指南:三大模式切換、游標移動、編輯刪除、複製貼上、搜尋取代、儲存離開全技巧