用 Crontab 定时任务自动清理站点无用日志文件
核心答案
定时任务自动清理站点无用日志文件 的核心思路是:通过 Linux 的 Crontab 定时执行一个 Shell 脚本,按天、周或月删除指定目录下超过一定天数的 .log、access.log、error.log 等旧文件。
本文从零开始,依次讲解准备工作、脚本编写、任务配置、常见错误排查和清理验证,适合用宝塔面板或纯命令行的用户直接照做。
清理前的准备
在动手之前,先确认你的服务器环境:
- 已安装 Crontab(大多数 Linux 发行版自带)
- 知道你的站点日志存放路径(例如:
/var/log/nginx/、/www/wwwlogs/) - 有 sudo 权限或 root 权限
如果使用宝塔面板,日志默认存放在 /www/wwwlogs/ 下,每个站点一个文件夹。
若不确定,可以登录面板查看“网站” -> 对应站点的“配置文件”中 access_log 和 error_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 会自动载入。
避坑指南
- 不要直接删除被进程打开的日志文件,否则空间不会立即释放,需要对 Nginx 执行
kill -USR1 cat /var/run/nginx.pid或重启服务。建议使用logrotate配合copytruncate模式,但本文的脚本会在删除后自动忽略(被打开的 .log 文件无法被rm删除?实际上rm只是解除链接,文件句柄仍存在,磁盘空间不会释放)。更稳妥的方式是在脚本中添加重载日志服务:
systemctl reload nginx
或者使用日志切割工具 logrotate,但涉及配置更复杂,本文不展开。
- 日志路径包含空格或特殊字符,脚本中的
find需要处理,建议先用简单路径测试。 - 测试脚本先别直接执行,先把
-exec rm改为-exec ls,看看会列出哪些文件,确认无误后再改回rm。 - Crontab 环境变量:Crontab 默认没有加载
~/.bash_profile,因此脚本中尽量使用绝对路径(如/usr/bin/find),或直接在脚本开头设置PATH。
效果验证
- 检查 Crontab 是否生效:
crontab -l
应该能看到刚才添加的行。
- 手动测试脚本:
/bin/bash /opt/clean-logs.sh
然后查看 /var/log/clean-log.log 是否有执行记录。
- 查看磁盘空间变化:
df -h
对比清理前后日志目录的大小。
- 检查日志目录:
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% 的异常。