搜「Linux定时清理日志脚本文件」的人,通常卡在同一处:知道要删旧日志,但不确定脚本该写成什么样、该放在哪个目录、定时任务该填哪条路径、以及怎么确认它真的按预期跑过。可以直接照着做的最小路径是:把清理脚本放到 /usr/local/sbin/ 下,用 find 按修改时间删除文件,用 crontab 每天定时调用,跑完查 /var/log/ 下的执行日志和 find 的删除结果。前提是先确认哪些日志被人为轮转、哪些被进程持续占用;正在被写入的文件不要交给一次性删除脚本处理。
处理这类需求的顺序是:先定位日志实际目录和文件命名规律,再写按-mtime判断的删除脚本,最后挂到crontab并用执行日志核对。适用范围是没有接入 logrotate 或不想改 logrotate 配置的简单场景;已有 logrotate 的主机,优先在/etc/logrotate.d/里调整,而不是再叠一层删除脚本。验证方式看脚本自身输出日志与目标目录文件数量变化;风险边界是递归删除、误匹配目录、删到被进程持有的文件导致空间不释放。
Linux定时清理日志脚本文件怎么写
「怎么写」对应的是整套动作里的第二步:已经知道哪个目录堆积了日志,现在要把删除规则固化成脚本。确认是不是卡在这一步,看两点:你是不是还在手工执行 rm,以及你能否说清要删文件的判断条件(按修改时间、按文件名后缀、按大小)。说不清条件,就还没到写脚本阶段,得先回去看目录。
脚本通常放在 /usr/local/sbin/,这个位置不在普通用户 PATH 里,避免误执行;名字建议带明确含义,例如 clean-app-logs.sh。下面这段可以直接复制后改路径使用:
#!/bin/bash
# 用途:清理指定目录下超过 N 天的日志文件
# 需要改的只有两处:LOG_DIR 和 DAYS
LOG_DIR="/var/log/myapp"
DAYS=7
LOGFILE="/var/log/clean-app-logs.log"
if [ ! -d "$LOG_DIR" ]; then
echo "$(date '+%F %T') 目录不存在: $LOG_DIR" >> "$LOGFILE"
exit 1
fi
echo "$(date '+%F %T') 开始清理 $LOG_DIR,阈值 ${DAYS} 天" >> "$LOGFILE"
find "$LOG_DIR" -type f -name "*.log" -mtime +$DAYS -print -delete >> "$LOGFILE" 2>&1
echo "$(date '+%F %T') 清理结束" >> "$LOGFILE"
几个参数的作用要写清楚:-type f 限定只处理普通文件,避免删到同名目录;-name "*.log" 把范围锁在日志后缀上;-mtime +7 表示修改时间在 7 天以前(不含今天);-print 会把即将删除的文件名先写进日志,这是事后核对的关键;-delete 必须放在所有过滤条件之后。脚本写完后执行 chmod 750 /usr/local/sbin/clean-app-logs.sh,先手动跑一次,看 /var/log/clean-app-logs.log 里是否列出了预期文件。
Linux定时清理日志脚本文件在哪里
「在哪里」包含两个位置,容易混在一起:脚本文件本身放哪,以及定时任务从哪里读。确认方法很直接——脚本用 ls -l /usr/local/sbin/clean-app-logs.sh 看是否存在、属主和权限是否合理;定时任务用 crontab -l 看当前用户的任务,用 ls /etc/cron.d/ 看系统级任务目录里有没有别处放的同名任务。

常见的落点有三类,需要结合主机现状确认用哪个:
/usr/local/sbin/或/usr/local/bin/:自建脚本的常规位置,重启后仍在。/etc/cron.d/:系统级定时任务,文件里需要多写一列执行用户,格式与crontab -l不同。/etc/cron.daily/:只放脚本、不写时间表达式,由系统按日触发,具体触发时刻取决于/etc/crontab和anacron配置。
排查「任务没跑」时,先看 cron 自己的日志:Debian/Ubuntu 系通常在 /var/log/syslog 里用 grep CRON /var/log/syslog 查,RHEL/CentOS 系在 /var/log/cron 里查。这里能看到某时刻有没有启动过该命令,以及是否有 command not found 或权限报错。系统是否启用 cron 服务也要确认:systemctl status cron 或 systemctl status crond,服务名随发行版不同。
定时清理日志脚本文件:先把能核对的事实摆清楚
在改任何配置之前,先把下面这些能直接查到的信息列出来,避免凭印象动手。
- 日志目录的实际路径和文件命名:
ls -lh /var/log/myapp | head -30,看文件名是否统一带.log后缀,有没有.log.1、.gz这类轮转产物。 - 文件的修改时间分布:
find /var/log/myapp -type f -name "*.log" -mtime +7 | head,先只看不删,确认这条命令筛出来的正是你想删的。 - 哪些文件正被进程打开:
lsof +D /var/log/myapp或ls -l /proc/*/fd 2>/dev/null | grep myapp,被持有的文件删掉后空间通常不会立即释放。 - 是否已有 logrotate 接管:
ls /etc/logrotate.d/和cat /etc/logrotate.d/myapp,有配置的话,按天轮转加rotate N已经能控制总量。 - 磁盘现状:
df -h看分区使用率,du -sh /var/log/myapp看该目录占用。
这几项摆清楚后,「要不要写删除脚本」往往自己就有答案了:如果 logrotate 已存在只是配置里 rotate 数值偏大,改配置比新增脚本更稳;如果没有轮转机制、日志是应用自己按日期追加的,才轮到脚本处理。
定时清理日志脚本文件最容易搞错的一点
最常见的误解是把「按修改时间删除」等同于「删掉正在写的当前日志」。find -mtime +7 判断的是文件最后修改时间距离现在超过 7 天,正在被追加的日志修改时间是当下,不会被这条规则命中——但如果文件名匹配范围写得太宽,比如误用 *.log* 或漏写 -type f,就可能把当天日志或目录本身卷进去。

能把两种情况区分开的检查动作是:把 -delete 去掉,只保留 -print 先跑一遍,对比输出清单和你预期要删的清单。下面这条命令就是干这个用的,它只打印不删除:
find /var/log/myapp -type f -name "*.log" -mtime +7 -printf "%TY-%Tm-%Td %TH:%TM %s %p\n"
输出里如果出现当天的日期,说明时间阈值或匹配条件有问题,此时不要加 -delete。另一个分界点是进程占用:如果某个日志文件的修改时间很旧但仍被进程打开(用 lsof 能查到),删掉它可能让进程继续往已删除的 inode 写,du 看不到、df 却不降。这种情况需要重启对应进程或改用 truncate,而不是靠清理脚本解决。
定时清理日志脚本文件:一个照着就能做完的做法
以下路径假设日志目录为 /var/log/myapp、保留 7 天、每天凌晨 3 点 20 分执行。换成自己的目录时,只改 LOG_DIR、DAYS 和 crontab 里的时间字段。
- 先确认目录存在且有日志文件:
ls -ld /var/log/myapp && ls -lh /var/log/myapp | head。该步应看到目录属主和若干.log文件。 - 创建脚本(内容见第一节),保存为
/usr/local/sbin/clean-app-logs.sh,然后赋权:chmod 750 /usr/local/sbin/clean-app-logs.sh,chown root:root /usr/local/sbin/clean-app-logs.sh。 - 先做干跑验证,确认筛选结果:
find /var/log/myapp -type f -name "*.log" -mtime +7 -print。该步应只列出明显陈旧的文件。 - 手动执行一次脚本:
/usr/local/sbin/clean-app-logs.sh; echo $?。该步应返回0,并在/var/log/clean-app-logs.log里看到「开始清理」「清理结束」两行和中间的文件列表。 - 写入定时任务,使用 root 身份执行
crontab -e,追加一行:20 3 * * * /usr/local/sbin/clean-app-logs.sh
保存后用crontab -l核对是否写入成功,字段顺序为「分 时 日 月 周 命令」。cron 环境变量精简,脚本内一律写绝对路径,不依赖当前目录和自定义 PATH。 - 确认 cron 服务在运行:
systemctl is-active cron(或crond)。该步应返回active。 - 次日核对结果:
tail -30 /var/log/clean-app-logs.log看是否有当天的执行记录;grep CRON /var/log/syslog | tail或grep clean-app /var/log/cron看 cron 是否在 03:20 拉起过该命令;再用du -sh /var/log/myapp对比清理前的大小。
如果第 7 步只看到定时任务被启动、脚本日志却没有新增,通常是脚本没有可执行权限、shebang 路径不对,或者 cron 用户对该目录无读权限,按 /var/log/syslog 或 /var/log/cron 里的报错逐条排除即可。若该主机已有 logrotate 管理同一批日志,建议把脚本停掉,回到 /etc/logrotate.d/ 里调整保留份数和轮转周期,避免两套机制互相干扰。