日志自动清理脚本避免磁盘占满服务器宕机
写好日志自动清理脚本,彻底避免磁盘占满导致服务器宕机
很多服务器宕机并非因为配置不足,而是日志文件长期积累撑满磁盘,导致服务无法写入新数据甚至系统崩溃。
本文围绕日志自动清理脚本避免磁盘占满服务器宕机这一核心需求,从零开始教你编写清理脚本、配置定时任务,并给出常见报错的处理方法和验证技巧。
无论你用的是宝塔面板还是纯命令行,按步骤执行都能搞定。
为什么日志不清理会触发服务器宕机?
日志文件(如Nginx访问日志、MySQL慢查询日志、系统messages日志)会持续增大。
当磁盘使用率达到100%,操作系统会阻止任何写入操作,数据库、网站、SSH登录都可能直接卡死。
手动清理虽然能临时救急,但无法应对长期运维需求。
必须借助日志自动清理脚本,让服务器定期自主回收空间。
准备条件:确认你的环境支持脚本化清理
- 一台Linux服务器(CentOS 7/8、Ubuntu 20.04/22.04或类似版本)
- 有sudo或root权限(执行cron和删除文件需要)
- 已安装cron服务(一般系统自带,未安装可用
yum install cronie或apt install cron补上) - 知道你的日志存放路径(常见路径:
/var/log,或网站程序自定义目录如/www/wwwlogs)
编写日志自动清理脚本
新建一个脚本文件,比如/usr/local/bin/clean_logs.sh,内容如下(请根据实际日志路径调整LOG_DIR和保留天数):
#!/bin/bash
# 日志自动清理脚本 – 删除指定目录下N天前的日志文件
LOG_DIR="/var/log/nginx" # 修改为你的日志目录
DAYS_BEFORE=7 # 保留最近7天的日志
find "$LOG_DIR" -type f -name "*.log" -mtime +$DAYS_BEFORE -exec rm -f {} \;
# 可选:压缩当日日志再删除更早的(此处仅演示基础清理)
echo "$(date): 已清理 $LOG_DIR 中 $DAYS_BEFORE 天前的日志文件" >> /var/log/clean_logs.log
脚本说明:
-mtime +7表示修改时间超过7天的文件-exec rm -f {} \;执行删除,-f避免误删提示- 最后一行记录执行日志,方便事后排查
保存后赋予执行权限:
chmod +x /usr/local/bin/clean_logs.sh
配置cron定时任务让脚本自动运行
运行crontab -e编辑当前用户的定时任务(如果是root用户,脚本会拥有更高权限)。
添加下面一行:
0 3 * * * /usr/local/bin/clean_logs.sh
这表示每天凌晨3点执行一次清理脚本。
你可以根据日志增长速度调整频率,比如改成每小时执行一次(0 * * * *)。
保存后重启cron服务:
# CentOS/RHEL
systemctl restart crond
# Ubuntu/Debian
systemctl restart cron
避坑指南:新手最容易犯的三个错误
- 路径写错:脚本中
LOG_DIR必须与服务器实际日志目录一致。可以先手动执行find /var/log -name "*.log" | head查看文件名是否带后缀。 - 删除权限不足:如果日志归
www用户所有但脚本以root运行,一般没问题;但如果日志位于只读挂载点则无法删除。务必先用ls -l检查目录权限。 - 误删数据库或系统关键日志:建议先用
-exec echo {} \;模拟执行一次,确认列出的文件都是你想删的,再改成-exec rm -f {} \;。
验证清理效果
- 手动运行一次脚本:
bash /usr/local/bin/clean_logs.sh,观察终端有无报错。 - 检查脚本执行日志:
cat /var/log/clean_logs.log。 - 对比清理前后的磁盘用量:
df -h。 - 确保cron任务在正确时间运行:查看cron日志(通常
/var/log/cron)确认有CMD记录。
常见问题解答
Q1: 脚本执行提示“find: unknown predicate”,是什么原因?
A: 一般是语法错误,比如-mtime后面漏了空格或数字。对照本文示例检查每个参数之间的空格。
Q2: 清理后磁盘空间并没有释放,为什么?
A: 如果文件正被某个进程占用(例如日志文件被tail命令打开),删除后空间不会立即释放。重启相关进程或使用logrotate的copytruncate模式即可。
Q3: 我想保留7天的日志,但按修改时间不准,怎么办?
A: 可以改用-mtime(修改时间)或-ctime(状态改变时间)。更精确的做法是使用logrotate工具,它支持按大小和日期轮转。日志自动清理脚本适用于简单场景,复杂需求建议配合logrotate。
Q4: 这个脚本能用于Windows服务器吗?
A: 不能。本文针对Linux服务器。Windows可使用计划任务配合PowerShell脚本实现类似功能。
总结
通过编写一个简单的shell脚本并加入cron,你就能实现日志自动清理脚本避免磁盘占满服务器宕机的目标。
关键在于选择正确的日志路径、设置合理的保留天数,并经过模拟测试。
建议将脚本和cron配置纳入服务器初始部署规范,避免后续手动介入。
遇到异常时优先回看避坑部分以及常见问题解答。
如果你正在管理多台服务器,还可以结合Ansible等工具批量分发脚本,将磁盘满的告警扼杀在摇篮里。