Linux磁盘空间告急?巧用du与find命令组合拳精准定位空间消耗源 📅 2026/7/6 12:22:19 1. 当磁盘空间告急时先做这些关键检查那天我正在午休突然收到服务器告警短信——磁盘使用率超过95%。这种场景对于运维人员来说就像半夜被火警铃吵醒一样刺激。我立刻打开终端连上服务器开始了这场与磁盘空间的较量。首先用df -h快速查看整体情况。这个命令就像医院的X光机能一眼看出哪个分区病入膏肓$ df -h Filesystem Size Used Avail Use% Mounted on /dev/vda1 50G 48G 1.2G 98% /看到根目录只剩1.2G可用空间我马上想到几个常见嫌疑犯日志文件、缓存数据、残留的安装包。但盲目猜测不如科学排查这时候就该请出我们的黄金搭档——du和find命令。2. 用du命令快速定位空间大胃王dudisk usage就像个精明的仓库管理员能准确统计每个目录占用的空间。我最常用的组合拳是$ du -h --max-depth1 / | sort -hr | head -10 48G / 23G /var 12G /home 8.5G /usr 1.2G /opt这个命令分解来看-h人类可读格式GB/MB/KB--max-depth1只显示一级子目录sort -hr按人类可读数值逆序排序head -10只显示前10条结果发现/var目录异常庞大后我继续深入调查$ du -h --max-depth1 /var | sort -hr | head -5 23G /var 18G /var/log 4.5G /var/lib 800M /var/cache3. find命令精准打击大文件定位到/var/log这个嫌犯后就该find上场了。它像探雷器一样能精确找出具体的大文件$ find /var/log -type f -size 100M -exec ls -lh {} \; -rw-r--r-- 1 root root 2.3G Jun 15 10:23 /var/log/syslog.1 -rw-r--r-- 1 root root 1.8G Jun 14 09:12 /var/log/kern.log.2这里的关键参数-type f只查找文件-size 100M大于100MB的文件-exec ls -lh {} \;对找到的文件执行ls -lh命令更高级的用法是结合xargs处理大量文件$ find /var/log -type f -size 500M | xargs ls -lhS4. 实战中的组合技与避坑指南在实际工作中我总结出几个高效组合技组合技一快速定位并删除过期日志# 查找7天前且大于100M的日志文件 $ find /var/log -name *.log -mtime 7 -size 100M -exec rm -v {} \;组合技二统计目录下各类文件的空间占用$ find /var/log -type f -name *log* -exec du -h {} | sort -hr踩过的坑也不少权限问题系统目录需要sudo权限但谨慎使用sudo rm硬链接陷阱用ls -i查看inode号避免删除被多个硬链接引用的文件服务锁定文件删除前用lsof | grep filename检查是否有进程正在使用5. 进阶技巧自动化监控与清理对于经常爆满的服务器我通常会设置自动化脚本。比如这个每日检查的cron job#!/bin/bash THRESHOLD90 CURRENT$(df / | awk {print $5} | tail -1 | sed s/%//) if [ $CURRENT -gt $THRESHOLD ]; then LOG_FILE/tmp/disk_cleanup_$(date %Y%m%d).log echo 【$(date)】磁盘使用率${CURRENT}%开始清理... $LOG_FILE find /var/log -name *.gz -mtime 30 -delete $LOG_FILE journalctl --vacuum-size200M $LOG_FILE docker system prune -f $LOG_FILE fi6. 特殊情况处理那些年遇到的奇葩案例曾经有台服务器/var目录占用异常但用常规方法找不到大文件。最后发现是某个docker容器的日志文件被误配置为直接写入主机系统而且文件被删除后空间仍未释放——因为进程还在持有文件描述符。解决方法# 找出持有已删除文件的进程 $ lsof L1 # 然后重启相关服务 $ systemctl restart service_name另一个案例是某次/tmp目录被占满发现是某个Python脚本不断生成临时文件却未清理。这种时候可以用find /tmp -type f -user username快速定位用户文件。7. 预防胜于治疗日常维护建议根据多年运维经验我总结出这些预防措施日志轮转配置logrotate对关键日志进行自动切割和压缩监控预警设置Prometheus或Zabbix监控磁盘空间定期清理对/tmp、缓存目录设置自动清理策略容器管理docker和k8s环境要特别注意日志和临时文件比如配置logrotate示例# /etc/logrotate.d/nginx /var/log/nginx/*.log { daily rotate 30 compress missingok notifempty sharedscripts postrotate /usr/bin/systemctl reload nginx /dev/null endscript }8. 当常规方法失效时的终极武器如果上述方法都无效可能需要使用更底层的工具检查隐藏空间df和du结果不一致时可能是文件被删除但未释放# 查看已删除但未释放的文件 $ lsof | grep deleted检查inode耗尽有时空间足够但inode用尽$ df -i使用ncdu可视化工具交互式查看磁盘使用情况$ ncdu /var