日志自动清理脚本避免磁盘占满服务器宕机

写好日志自动清理脚本,彻底避免磁盘占满导致服务器宕机

很多服务器宕机并非因为配置不足,而是日志文件长期积累撑满磁盘,导致服务无法写入新数据甚至系统崩溃。
本文围绕日志自动清理脚本避免磁盘占满服务器宕机这一核心需求,从零开始教你编写清理脚本、配置定时任务,并给出常见报错的处理方法和验证技巧。
无论你用的是宝塔面板还是纯命令行,按步骤执行都能搞定。

为什么日志不清理会触发服务器宕机?

日志文件(如Nginx访问日志、MySQL慢查询日志、系统messages日志)会持续增大。
当磁盘使用率达到100%,操作系统会阻止任何写入操作,数据库、网站、SSH登录都可能直接卡死。
手动清理虽然能临时救急,但无法应对长期运维需求。
必须借助日志自动清理脚本,让服务器定期自主回收空间。

准备条件:确认你的环境支持脚本化清理

  • 一台Linux服务器(CentOS 7/8、Ubuntu 20.04/22.04或类似版本)
  • 有sudo或root权限(执行cron和删除文件需要)
  • 已安装cron服务(一般系统自带,未安装可用yum install cronieapt 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

避坑指南:新手最容易犯的三个错误

  1. 路径写错:脚本中LOG_DIR必须与服务器实际日志目录一致。可以先手动执行find /var/log -name "*.log" | head查看文件名是否带后缀。
  2. 删除权限不足:如果日志归www用户所有但脚本以root运行,一般没问题;但如果日志位于只读挂载点则无法删除。务必先用ls -l检查目录权限。
  3. 误删数据库或系统关键日志:建议先用-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命令打开),删除后空间不会立即释放。重启相关进程或使用logrotatecopytruncate模式即可。

Q3: 我想保留7天的日志,但按修改时间不准,怎么办?
A: 可以改用-mtime(修改时间)或-ctime(状态改变时间)。更精确的做法是使用logrotate工具,它支持按大小和日期轮转。日志自动清理脚本适用于简单场景,复杂需求建议配合logrotate

Q4: 这个脚本能用于Windows服务器吗?
A: 不能。本文针对Linux服务器。Windows可使用计划任务配合PowerShell脚本实现类似功能。

总结

通过编写一个简单的shell脚本并加入cron,你就能实现日志自动清理脚本避免磁盘占满服务器宕机的目标。
关键在于选择正确的日志路径、设置合理的保留天数,并经过模拟测试。
建议将脚本和cron配置纳入服务器初始部署规范,避免后续手动介入。
遇到异常时优先回看避坑部分以及常见问题解答。

如果你正在管理多台服务器,还可以结合Ansible等工具批量分发脚本,将磁盘满的告警扼杀在摇篮里。

分享到:
上一篇
Docker镜像加速器解决容器拉取缓慢问题
下一篇
Docker镜像瘦身节省住宅主机硬盘空间
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意