用 Crontab 定时任务自动清理站点无用日志文件

核心答案

定时任务自动清理站点无用日志文件 的核心思路是:通过 Linux 的 Crontab 定时执行一个 Shell 脚本,按天、周或月删除指定目录下超过一定天数的 .logaccess.logerror.log 等旧文件。
本文从零开始,依次讲解准备工作、脚本编写、任务配置、常见错误排查和清理验证,适合用宝塔面板或纯命令行的用户直接照做。

清理前的准备

在动手之前,先确认你的服务器环境:

  • 已安装 Crontab(大多数 Linux 发行版自带)
  • 知道你的站点日志存放路径(例如:/var/log/nginx//www/wwwlogs/
  • 有 sudo 权限或 root 权限

如果使用宝塔面板,日志默认存放在 /www/wwwlogs/ 下,每个站点一个文件夹。
若不确定,可以登录面板查看“网站” -> 对应站点的“配置文件”中 access_logerror_log 的路径。

编写清理脚本

创建一个脚本文件,例如 /opt/clean-logs.sh,内容如下:

#!/bin/bash
# 清理 7 天前的 .log 文件,可根据需要修改天数
LOG_DIRS=(
  "/var/log/nginx"
  "/var/log/apache2"
  "/www/wwwlogs"
)
DAYS=7

for dir in "${LOG_DIRS[@]}"; do
  if [ -d "$dir" ]; then
    find "$dir" -type f -name "*.log" -mtime +$DAYS -exec rm -f {} \;
    echo "$(date) 清理 $dir 中 $DAYS 天前的日志文件完成" >> /var/log/clean-log.log
  fi
done
说明find -mtime +7 表示修改时间在 7 天前的文件,-exec rm -f {} \; 删除它们。你也可以改为将文件压缩归档后再删除,但不建议保留无用日志。

保存后赋予执行权限:

chmod +x /opt/clean-logs.sh

配置定时任务

执行 crontab -e 进入编辑模式(如果第一次会提示选择编辑器,选 vim 或 nano)。
在文件末尾添加以下行:

0 3 * * 0 /bin/bash /opt/clean-logs.sh

解释:

  • 0 3 * * 0 表示每周日凌晨 3 点执行(分 时 日 月 周)
  • /bin/bash /opt/clean-logs.sh 是执行命令的绝对路径

如果你希望每天清理一次,可以写成 0 2 * * *(每天凌晨 2 点)。
修改后保存退出。
Crontab 会自动载入。

避坑指南

  1. 不要直接删除被进程打开的日志文件,否则空间不会立即释放,需要对 Nginx 执行 kill -USR1 cat /var/run/nginx.pid 或重启服务。建议使用 logrotate 配合 copytruncate 模式,但本文的脚本会在删除后自动忽略(被打开的 .log 文件无法被 rm 删除?实际上 rm 只是解除链接,文件句柄仍存在,磁盘空间不会释放)。更稳妥的方式是在脚本中添加重载日志服务:
   systemctl reload nginx

或者使用日志切割工具 logrotate,但涉及配置更复杂,本文不展开。

  1. 日志路径包含空格或特殊字符,脚本中的 find 需要处理,建议先用简单路径测试。
  2. 测试脚本先别直接执行,先把 -exec rm 改为 -exec ls,看看会列出哪些文件,确认无误后再改回 rm
  3. Crontab 环境变量:Crontab 默认没有加载 ~/.bash_profile,因此脚本中尽量使用绝对路径(如 /usr/bin/find),或直接在脚本开头设置 PATH

效果验证

  1. 检查 Crontab 是否生效
   crontab -l

应该能看到刚才添加的行。

  1. 手动测试脚本
   /bin/bash /opt/clean-logs.sh

然后查看 /var/log/clean-log.log 是否有执行记录。

  1. 查看磁盘空间变化
   df -h

对比清理前后日志目录的大小。

  1. 检查日志目录
   ls -lh /www/wwwlogs/

应该看不到 7 天前的 .log 文件。

常见问题解答

Q1:清理后网站日志不更新了?

A:如果 Nginx 仍在运行,删除旧日志文件不影响新的日志写入,因为新日志会在原文件路径创建新文件。
但如果删除了被打开的文件且 Nginx 未重载,可能需要重启 Nginx 服务。
安全做法是在清理脚本最后加上 systemctl reload nginx

Q2:Crontab 没执行,脚本日志为空怎么办?

A:首先检查系统时间是否正确,date 命令查看。
其次检查 Crontab 是否开启:systemctl status crond
如果脚本中有错误,可以将执行结果输出到日志文件,例如在 Crontab 行末尾加上 >> /var/log/clean-log.log 2>&1 来捕获错误。

Q3:日志文件不止 .log 后缀怎么办?

A:可以将 -name "*.log" 改为 -regex ".*\.(log|txt)" 或使用多个 -name 条件(-name "*.log" -o -name "*.txt")。
也可以直接清理整个目录下超过 N 天的所有文件(不推荐,可能误删)。

Q4:我不想写脚本,用宝塔面板怎么设置?

A:宝塔面板有“定时任务”功能,添加 Shell 脚本任务,内容可以只用一条 find 命令。
例如:find /www/wwwlogs -name "*.log" -mtime +7 -delete
注意 shell 环境选 /bin/bash

写在最后

通过上述步骤,你已经掌握了利用 Crontab 自动清理站点无用日志文件的方法。
如果服务器性能或带宽资源有限,也可以考虑升级云服务器配置。
例如,泽御云(www.zeyuyun.com)提供多种规格的云服务器,具备正规 IDC/ISP 资质(许可证号 B1-20261342),适合长期稳定运行的业务。
需要代理或批量采购可参考其官网。
但无论使用哪家服务商,本文的清理逻辑都通用。
遇到问题先回看避坑部分,通常能解决 90% 的异常。

分享到:
上一篇
Nginx完整多域名配置搭建多语言外贸站点
下一篇
宝塔自动化脚本批量申请免费SSL证书,新手也能直接操作
1
系统公告

机房迁移升级通知

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