服务器运行过程中会产生大量日志文件、临时文件、缓存数据,长期积累会占用大量磁盘空间,导致系统性能下降甚至服务崩溃。手动清理效率低下且容易遗漏,自动化方案能确保清理工作按时、按规则执行。
本方案基于Linux系统,使用crontab定时任务配合find命令实现,无需安装额外软件。所有操作均通过SSH连接服务器执行。
登录服务器后,先确认系统信息:
``` uname -a cat /etc/os-release ```记录系统类型(如CentOS、Ubuntu等),不同系统的日志路径可能稍有差异。
清理前先查看当前磁盘占用:
``` df -h du -sh /var/log/ du -sh /tmp/ ```这能帮助你了解哪些目录最需要清理。
创建专用目录存放清理脚本:
``` mkdir -p /opt/cleanup cd /opt/cleanup ```创建cleanup.sh文件:
``` nano /opt/cleanup/cleanup.sh ```输入以下内容:
``` !/bin/bash 服务器自动化清理脚本 作者:系统管理员 创建时间:$(date) 设置日志文件 LOG_FILE="/var/log/cleanup_$(date +%Y%m%d).log" exec > >(tee -a "$LOG_FILE") 2>&1 echo "===== 清理开始时间:$(date) =====" 1. 清理Nginx日志(保留最近7天) echo "清理Nginx日志..." find /var/log/nginx/ -name ".log" -type f -mtime +7 -delete find /var/log/nginx/ -name ".gz" -type f -mtime +30 -delete 2. 清理系统日志(保留最近30天) echo "清理系统日志..." find /var/log/ -name ".log" -type f -mtime +30 -delete find /var/log/ -name "messages-" -type f -mtime +30 -delete find /var/log/ -name "secure-" -type f -mtime +30 -delete 3. 清理临时文件 echo "清理临时文件..." find /tmp/ -type f -atime +1 -delete find /var/tmp/ -type f -atime +7 -delete 4. 清理Docker容器日志(如果使用Docker) if command -v docker &> /dev/null; then echo "清理Docker日志..." find /var/lib/docker/containers/ -name ".log" -type f -size +100M -delete fi 5. 清理包管理器缓存 if [ -f /etc/redhat-release ]; then echo "清理yum缓存..." yum clean all elif [ -f /etc/debian_version ]; then echo "清理apt缓存..." apt-get clean fi 6. 清理空目录 echo "清理空目录..." find /tmp/ -type d -empty -mtime +1 -delete find /var/tmp/ -type d -empty -mtime +7 -delete echo "===== 清理完成时间:$(date) =====" echo "磁盘使用情况:" df -h 记录清理详情 echo "详细清理统计:" >> "$LOG_FILE" find /var/log/ -name ".log" -type f -mtime +30 -exec ls -lh {} \; >> "$LOG_FILE" 2>/dev/null || true ```给脚本添加执行权限:
``` chmod +x /opt/cleanup/cleanup.sh ```find命令关键参数说明:
修改脚本,添加安全保护措施:
``` 在脚本开头添加 set -e 任何命令失败则立即退出 set -u 使用未定义变量时报错 危险目录保护列表 PROTECTED_DIRS=( "/" "/home" "/etc" "/usr" "/bin" "/sbin" "/lib" "/lib64" ) 检查是否在保护目录中 current_dir=$(pwd) for dir in "${PROTECTED_DIRS[@]}"; do if [[ "$current_dir" == "$dir" ]]; then echo "错误:不能在保护目录 $dir 中执行清理操作" exit 1 fi done ```对于重要环境,可以先查看要删除的文件,确认后再删除:
``` 替换 -delete 为 -print 先查看 echo "将要删除的文件列表:" find /var/log/nginx/ -name ".log" -type f -mtime +7 -print 确认后手动执行删除 find /var/log/nginx/ -name ".log" -type f -mtime +7 -delete ```编辑当前用户的crontab:
``` crontab -e ```在文件末尾添加(每天凌晨2点执行):
``` 服务器自动清理任务 0 2 /opt/cleanup/cleanup.sh ```
如果需要接收执行结果邮件,在crontab中添加:
``` MAILTO="admin@yourdomain.com" 0 2 /opt/cleanup/cleanup.sh ```先以安全模式测试:
``` 1. 创建测试文件 touch /tmp/test_file_$(date +%s).log touch /var/log/test_$(date +%s).log 2. 修改文件时间为30天前 find /tmp/ -name "test_.log" -exec touch -d "30 days ago" {} \; find /var/log/ -name "test_.log" -exec touch -d "30 days ago" {} \; 3. 执行脚本(先不删除) cp cleanup.sh test_cleanup.sh 将脚本中所有 -delete 替换为 -print sed -i 's/-delete/-print/g' test_cleanup.sh chmod +x test_cleanup.sh ./test_cleanup.sh ```检查crontab配置是否正确:
``` crontab -l ```查看cron服务状态:
``` systemctl status cron Ubuntu/Debian systemctl status crond CentOS/RHEL ```每次执行后都会生成日志文件:
``` ls -la /var/log/cleanup_.log tail -f /var/log/cleanup_20240101.log 查看最新日志 ```在cleanup.sh末尾添加:
``` 清理30天前的清理日志 find /var/log/ -name "cleanup_.log" -type f -mtime +30 -delete ```创建监控脚本disk_check.sh:
``` !/bin/bash THRESHOLD=80 使用率阈值 CURRENT=$(df / | grep / | awk '{ print $5 }' | sed 's/%//g') if [ "$CURRENT" -gt "$THRESHOLD" ]; then echo "警告:磁盘使用率 ${CURRENT}% 超过阈值 ${THRESHOLD}%" | mail -s "磁盘空间告警" admin@yourdomain.com 立即执行清理 /opt/cleanup/cleanup.sh fi ```添加到crontab每小时检查一次:
``` 0 /opt/cleanup/disk_check.sh ```如果脚本无法删除某些文件,检查文件权限:
``` ls -la /var/log/nginx/access.log ```可能需要以root权限执行:
``` sudo crontab -e 或者修改脚本使用sudo 0 2 sudo /opt/cleanup/cleanup.sh ```某些日志文件可能被服务进程占用,需要先清空内容而不是删除:
``` 对于Nginx日志,可以这样处理 echo "" > /var/log/nginx/access.log echo "" > /var/log/nginx/error.log 或者使用logrotate工具 ```根据不同应用调整清理规则:
``` MySQL日志 find /var/log/mysql/ -name ".log" -type f -mtime +7 -delete Apache日志 find /var/log/apache2/ -name ".log" -type f -mtime +7 -delete 应用特定日志 find /opt/yourapp/logs/ -name ".log" -type f -mtime +3 -delete ```在删除前备份关键日志:
``` 在cleanup.sh中添加 BACKUP_DIR="/backup/logs" mkdir -p "$BACKUP_DIR" find /var/log/nginx/ -name "access.log" -type f -mtime +7 -exec cp {} "$BACKUP_DIR/nginx_$(date +%Y%m%d).log" \; ```对于系统服务日志,建议使用logrotate:
``` 安装logrotate(通常已预装) 配置示例 /etc/logrotate.d/nginx /var/log/nginx/.log { daily missingok rotate 30 compress delaycompress notifempty create 640 nginx adm sharedscripts postrotate [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid` endscript } ```按照以上步骤配置后,服务器将自动按时清理过期文件,确保磁盘空间充足。定期检查/var/log/cleanup_.log文件确认执行情况,根据实际需求调整清理策略。
易频IT社区是综合性互联网IT技术门户网站,专注分享网络技术、服务器运维、网络安全、编程开发、系统架构、云计算、大数据等行业干货,实时更新IT行业资讯、零基础教程、实战案例,为IT从业者、技术爱好者提供专业的学习交流平台。
Copyright © 2021-2026 易频IT社区. All Rights Reserved. 备案号:闽ICP备2023013482号 网站地图