服务器上的日志文件如果一直不清理,迟早会把磁盘占满。最省心的办法是用 Linux 的 cron job 定期执行一条 find 命令,自动删掉 30 天前的旧文件。本文以每天清理 /logs 目录为例,记录完整的配置过程。
编写清理脚本
cron 系统专门提供了 /etc/cron.daily 目录,放在这个目录下的可执行脚本会被每天自动执行一次。我们在这里创建一个脚本:
cd /etc/cron.daily
vi logcron
输入如下内容:
#!/bin/sh
find /logs -type f -ctime +30 | xargs rm -rf
第二行就是核心:在 /logs 目录下查找 30 天之前的普通文件,然后交给 rm -rf 删除。
赋予可执行权限
保存文件后,执行如下命令给该文件加上可执行权限,否则 cron 不会运行它:
chmod +x /etc/cron.daily/logcron
到这里配置就完成了,之后系统每天都会自动清理一次超过 30 天的文件。
find 的时间参数:-mtime 与 -ctime
find 按时间筛选文件时有三个容易混淆的参数:
| 参数 | 含义 |
|---|---|
-mtime |
文件内容最后一次被修改(modify)的时间 |
-ctime |
文件的 inode 元数据(如权限、所有者、链接数)或内容最后一次变更(change)的时间 |
-atime |
文件最后一次被读取(access)的时间 |
+30 表示”超过 30 天”,-30 表示”30 天以内”。注意修改文件内容会同时更新 mtime 和 ctime,但仅修改权限等元数据只会更新 ctime 而不动 mtime,所以 find /logs -type f -ctime +30 找到的通常就是那些长期没有被改动过的老文件。
更灵活的替代方案:crontab
如果不想把脚本放进 /etc/cron.daily(比如希望控制到具体的分钟),也可以用 crontab -e 为当前用户添加定时任务,例如每天凌晨 2 点执行:
0 2 * * * /path/to/logcron
两种方式任选其一即可,核心都是那条 find ... | xargs rm -rf。