Linux du/find 命令实战:5步定位并清理占用超1GB的日志文件
2026/7/6 12:08:57 网站建设 项目流程

Linux磁盘空间急救指南:5步精准定位并清理超1GB日志文件

当服务器突然告警磁盘空间不足时,作为运维人员的你该如何快速应对?本文将带你深入实战,通过一系列高效命令组合和自动化脚本,精准定位那些"空间吞噬者"——尤其是常见的日志文件,并安全释放宝贵磁盘空间。

1. 快速诊断:全局磁盘使用概览

在开始清理之前,我们需要先了解整个系统的磁盘使用情况。就像医生看病要先做全面检查一样,以下命令能让你快速掌握全局:

df -hT

这个命令会显示所有挂载点的使用情况,关键列包括:

  • Filesystem:磁盘分区
  • Type:文件系统类型
  • Size:总容量
  • Used:已用空间
  • Avail:可用空间
  • Use%:使用百分比
  • Mounted on:挂载点

提示:重点关注Use%超过80%的分区,特别是/var和/目录,它们通常是日志和系统文件的聚集地。

如果想查看更详细的inode使用情况(当磁盘未满但无法创建新文件时可能需要):

df -i

2. 深度扫描:定位大文件和目录

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/www

2.2 精准查找大文件的终极命令

当需要精确查找超过特定大小的文件时,find命令是更强大的工具:

sudo find /path/to/search -type f -size +1G -exec ls -lh {} + | sort -k5 -hr

这个复杂命令的分解:

  1. find /path/to/search:在指定路径下搜索
  2. -type f:只查找文件(排除目录)
  3. -size +1G:大小超过1GB的文件
  4. -exec ls -lh {} +:对找到的每个文件执行ls -lh命令
  5. sort -k5 -hr:按第5列(文件大小)逆序排序

实际案例:查找/var/log下所有超过500MB的日志文件

sudo find /var/log -type f -size +500M -exec ls -lh {} + | sort -k5 -hr

3. 日志文件专项清理策略

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 -delete

4. 自动化清理脚本实战

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}%" fi

4.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>&1

5. 高级技巧与预防措施

5.1 使用ncdu进行交互式分析

对于喜欢可视化操作的用户,ncdu工具是不二之选:

sudo apt install ncdu # Debian/Ubuntu sudo yum install ncdu # CentOS/RHEL ncdu /var/log

操作指南:

  • 使用方向键导航
  • d删除选中文件/目录
  • n按文件名排序
  • s按文件大小排序

5.2 预防日志膨胀的最佳实践

  1. 合理配置日志级别:生产环境避免使用DEBUG级别
  2. 实施日志轮转:所有服务都应配置logrotate
  3. 使用集中式日志:考虑ELK或Graylog等方案
  4. 监控磁盘空间:设置Prometheus或Zabbix告警
  5. 容器日志管理:为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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询