在linux中,用crontab配合find自动清理过期日志的核心是:先用find精准定位并测试匹配旧日志(如find /var/log/myapp/ -name "*.log" -type f -mtime +7),再通过crontab定时执行安全删除命令(加-maxdepth 1、-name限定和权限验证),推荐封装为带错误处理的脚本并手动测试后再上线。

在 Linux 中,用 crontab 配合 find 自动清理过期日志,核心是:写好 find 命令精准定位并删除旧日志,再用 crontab 定时执行它。关键在于避免误删、确保权限可用、验证路径和时间逻辑正确。
确认日志路径和保留策略
先明确你要清理的日志位置(比如 /var/log/myapp/)和保留天数(如 7 天)。不要直接对 /var/log/ 根目录操作,容易影响系统服务。建议先用 ls -lt 看下文件时间排序,再用 find 测试是否能准确匹配:
-
find /var/log/myapp/ -name "*.log" -type f -mtime +7—— 列出 7 天前修改过的普通日志文件(不执行删除) - 加
-ls可看详细信息:find /var/log/myapp/ -name "*.log" -type f -mtime +7 -ls - 注意:
-mtime +7表示“超过 7×24 小时”,即 8 天及更早的文件;-mtime 7是恰好 7 天整(边界较难命中),一般用+N
构造安全的清理命令
实际清理时,推荐用 -delete(高效)或 -exec rm {} \;(兼容性更好)。但必须加防护措施:
- 加上
-maxdepth 1防止递归进子目录误删(如日志轮转产生的archive/) - 限定文件类型:
-name "*.log" -o -name "*.log.gz"或用-regex更精确 - 推荐写法(带日志记录):
find /var/log/myapp/ -maxdepth 1 -name "*.log" -type f -mtime +7 -print -delete 2>/dev/null | logger -t logclean - 如果脚本中执行,建议用完整路径:
/usr/bin/find,避免 crontab 环境中$PATH不一致
添加到 crontab 并测试执行权限
用 crontab -e 编辑当前用户定时任务(清理日志常用 root 或服务专用用户):
- 每天凌晨 2 点执行:
0 2 * * * /usr/bin/find /var/log/myapp/ -maxdepth 1 -name "*.log" -type f -mtime +7 -delete - 若需记录执行情况,改用脚本方式更清晰(见下一条)
- 务必确认运行该 cron 的用户有读取和删除目标目录的权限(
ls -ld /var/log/myapp/查看) - 测试:手动执行一遍命令,再运行
grep CRON /var/log/syslog(Debian/Ubuntu)或/var/log/cron(RHEL/CentOS)看是否报错
进阶:用 shell 脚本封装 + 错误处理
复杂场景建议写脚本,便于调试和加日志:
- 新建
/opt/scripts/clean-logs.sh,内容含#!/bin/bash和set -e防止出错继续 - 开头加
cd / &&或用绝对路径,避免 cron 默认工作目录干扰 - 加入简单判断:
if [ -d "/var/log/myapp" ]; then ... fi - 最后加一行
echo "$(date): cleaned $(find ... | wc -l) files" >> /var/log/logclean.log - crontab 中调用:
0 2 * * * /bin/bash /opt/scripts/clean-logs.sh - 给脚本加执行权限:
chmod +x /opt/scripts/clean-logs.sh
不复杂但容易忽略细节:路径写错、权限不足、时间单位理解偏差、没测试就上线。跑通一次 find 再配 cron,比反复修定时任务高效得多。











