Linux磁盘空间急救指南:5步精准定位并清理超1GB日志文件
当服务器突然告警磁盘空间不足时,作为运维人员的你该如何快速应对?本文将带你深入实战,通过一系列高效命令组合和自动化脚本,精准定位那些"空间吞噬者"——尤其是常见的日志文件,并安全释放宝贵磁盘空间。
1. 快速诊断:全局磁盘使用概览
在开始清理之前,我们需要先了解整个系统的磁盘使用情况。就像医生看病要先做全面检查一样,以下命令能让你快速掌握全局:
df -hT这个命令会显示所有挂载点的使用情况,关键列包括:
- Filesystem:磁盘分区
- Type:文件系统类型
- Size:总容量
- Used:已用空间
- Avail:可用空间
- Use%:使用百分比
- Mounted on:挂载点
提示:重点关注Use%超过80%的分区,特别是/var和/目录,它们通常是日志和系统文件的聚集地。
如果想查看更详细的inode使用情况(当磁盘未满但无法创建新文件时可能需要):
df -i2. 深度扫描:定位大文件和目录
2.1 查找大目录的黄金组合
发现空间不足的分区后,使用这个经典命令组合快速定位罪魁祸首:
du -h --max-depth=1 /path/to/directory | sort -hr | head -n 20参数解析:
du -h:以人类可读格式显示磁盘使用情况--max-depth=1:只显示指定目录的直系子目录sort -hr:按人类可读的数字大小逆序排序head -n 20:只显示前20个结果
例如,检查/var目录:
sudo du -h --max-depth=1 /var | sort -hr | head -n 10典型输出示例:
12G /var/log 8.4G /var/lib 1.2G /var/cache 756M /var/www2.2 精准查找大文件的终极命令
当需要精确查找超过特定大小的文件时,find命令是更强大的工具:
sudo find /path/to/search -type f -size +1G -exec ls -lh {} + | sort -k5 -hr这个复杂命令的分解:
find /path/to/search:在指定路径下搜索-type f:只查找文件(排除目录)-size +1G:大小超过1GB的文件-exec ls -lh {} +:对找到的每个文件执行ls -lh命令sort -k5 -hr:按第5列(文件大小)逆序排序
实际案例:查找/var/log下所有超过500MB的日志文件
sudo find /var/log -type f -size +500M -exec ls -lh {} + | sort -k5 -hr3. 日志文件专项清理策略
3.1 常见日志文件位置及清理方法
不同服务的日志位置和清理方式各异,这里列出最常见的几种:
| 服务类型 | 典型日志位置 | 清理方法 |
|---|---|---|
| 系统日志 | /var/log/messages | 使用logrotate或手动清空 |
| Apache/Nginx | /var/log/httpd/* | 配置日志轮转或使用truncate命令 |
| MySQL | /var/log/mysql/* | 清理慢查询日志和错误日志 |
| Docker | /var/lib/docker/containers | 配置日志驱动限制大小 |
| 应用日志 | /var/log/app/* | 使用应用的日志管理功能 |
3.2 安全清理日志的几种方式
方法一:使用truncate命令(保留文件)
sudo truncate -s 0 /var/log/large-log-file.log方法二:使用logrotate(推荐)
创建自定义logrotate配置/etc/logrotate.d/myapp:
/var/log/myapp/*.log { daily rotate 7 compress delaycompress missingok notifempty create 644 root root postrotate /usr/bin/systemctl reload myapp.service > /dev/null endscript }然后手动执行测试:
sudo logrotate -vf /etc/logrotate.d/myapp方法三:按时间清理(删除7天前的日志)
sudo find /var/log -name "*.log" -type f -mtime +7 -delete4. 自动化清理脚本实战
4.1 智能清理脚本示例
将以下脚本保存为/usr/local/bin/cleanup_logs.sh:
#!/bin/bash # 定义阈值(单位:MB) THRESHOLD=1024 # 1GB LOG_DIR="/var/log" echo "开始磁盘空间检查..." CURRENT_USAGE=$(df / | awk 'NR==2 {print $5}' | tr -d '%') if [ "$CURRENT_USAGE" -gt 80 ]; then echo "警告:根分区使用率已达${CURRENT_USAGE}%,开始清理..." # 查找大日志文件 LARGE_FILES=$(find $LOG_DIR -type f -size +${THRESHOLD}M -exec ls -lh {} + | sort -k5 -hr) if [ -n "$LARGE_FILES" ]; then echo "发现以下大文件:" echo "$LARGE_FILES" # 安全清理(保留文件但清空内容) while IFS= read -r line; do FILE=$(echo "$line" | awk '{print $9}') echo "清空文件: $FILE" truncate -s 0 "$FILE" done <<< "$LARGE_FILES" else echo "未找到超过${THRESHOLD}MB的大文件。" fi # 清理旧日志(30天前) find $LOG_DIR -name "*.log" -type f -mtime +30 -exec rm -f {} \; echo "清理完成。当前使用率:$(df / | awk 'NR==2 {print $5}')%" else echo "当前磁盘使用率正常:${CURRENT_USAGE}%" fi4.2 设置定时任务
让脚本每天自动运行:
sudo chmod +x /usr/local/bin/cleanup_logs.sh sudo crontab -e添加以下行(每天凌晨2点运行):
0 2 * * * /usr/local/bin/cleanup_logs.sh >> /var/log/cleanup.log 2>&15. 高级技巧与预防措施
5.1 使用ncdu进行交互式分析
对于喜欢可视化操作的用户,ncdu工具是不二之选:
sudo apt install ncdu # Debian/Ubuntu sudo yum install ncdu # CentOS/RHEL ncdu /var/log操作指南:
- 使用方向键导航
- 按
d删除选中文件/目录 - 按
n按文件名排序 - 按
s按文件大小排序
5.2 预防日志膨胀的最佳实践
- 合理配置日志级别:生产环境避免使用DEBUG级别
- 实施日志轮转:所有服务都应配置logrotate
- 使用集中式日志:考虑ELK或Graylog等方案
- 监控磁盘空间:设置Prometheus或Zabbix告警
- 容器日志管理:为Docker配置日志驱动和大小限制
# Docker日志限制示例(在daemon.json中配置) { "log-driver": "json-file", "log-opts": { "max-size": "100m", "max-file": "3" } }5.3 系统日志(journald)专项优化
对于使用systemd的系统,journal日志也可能占用大量空间:
# 检查journal当前占用空间 journalctl --disk-usage # 只保留最近2天的日志 sudo journalctl --vacuum-time=2d # 或限制总大小不超过500MB sudo journalctl --vacuum-size=500M # 永久配置(编辑/etc/systemd/journald.conf) SystemMaxUse=500M