用cron+shell脚本可稳定低开销清理临时文件,关键在于明确清理目标、避开运行时目录、保留日志痕迹;需手动验证、检查inodes、轮转清理日志。

直接用系统自带的定时任务工具(如 cron)配合 shell 脚本,就能稳定、低开销地清理服务器临时文件。关键不是写多复杂的脚本,而是明确“哪些该删”“什么时候删”“删之前要不要留痕”。
明确清理目标:别一上来就 rm -rf /tmp
盲目清空 /tmp 或 /var/tmp 可能导致正在运行的服务异常(比如某些 Java 应用、数据库临时锁文件、systemd 生成的 runtime 文件)。稳妥做法是:
- 优先清理指定目录下 超过 7 天未访问 的普通文件(用
find ... -type f -mtime +7 -delete) - 排除正在被进程占用的文件(
lsof +D /path可辅助判断,脚本中一般跳过更安全) - 避开关键路径:不碰 /run、/dev/shm、/sys 等运行时目录
- 对日志类临时文件(如
/var/log/nginx/*.tmp),建议单独规则,避免误删滚动中的日志
写一个可审计的清理脚本
脚本不追求一行命令,要留痕、可查、防误操作。例如:
(保存为 /usr/local/bin/clean-temp.sh,加执行权限)
#!/bin/bash LOG="/var/log/clean-temp.log" DATE=$(date '+%Y-%m-%d %H:%M:%S') <p>echo "[$DATE] 开始清理" >> "$LOG"</p><h1>清理 /tmp 下 7 天前的普通文件(不递归进 socket、pipe 等特殊文件)</h1><p>find /tmp -maxdepth 1 -type f -mtime +7 -print0 | while IFS= read -r -d '' file; do echo "删除: $file" >> "$LOG" rm -f "$file" done</p><h1>清理用户 home 下的 .cache(保留最近 3 天)</h1><p>find /home -maxdepth 3 -path '<em>/.cache/</em>' -type f -mtime +3 -delete 2>/dev/null</p><p>echo "[$(date '+%Y-%m-%d %H:%M:%S')] 清理完成" >> "$LOG"
用 cron 设置可靠定时任务
别依赖 crontab -e 临时编辑,统一用系统级定时任务,便于管理与备份:
- 新建
/etc/cron.daily/clean-temp(无需扩展名),内容为:#!/bin/sh<br>/usr/local/bin/clean-temp.sh
- 确保有执行权限:
chmod +x /etc/cron.daily/clean-temp - 系统会每天凌晨自动执行(具体时间由
/etc/anacrontab或发行版策略决定) - 想每 6 小时执行?改用
/etc/cron.d/clean-temp,内容:0 */6 * * * root /usr/local/bin/clean-temp.sh
上线前必须做的三件事
避免“脚本一跑,服务全挂”:
-
先手动试运行:加
-print替代-delete,确认列出的文件确实是冗余的 -
检查磁盘配额和 inodes:有些问题不是空间满,而是 inodes 耗尽(
df -i),清理小文件特别有用 -
保留最近 7 天日志:定期压缩或轮转
/var/log/clean-temp.log,避免日志自身膨胀

















