Ubuntu自动清理临时文件的推荐做法
一、先确认系统使用的清理机制
- 检查是否使用 systemd:运行命令:ps -p 1 -o comm=,输出为 systemd 表示使用现代 systemd 机制。
- 查看是否启用了定时清理:运行命令:systemctl list-timers | grep tmpfiles,若看到 systemd-tmpfiles-clean.timer 表示已启用按周期清理。
- 老系统可能使用 cron + tmpreaper(Debian/Ubuntu 常见)或 tmpwatch(RHEL/CentOS 常见),可检查 /etc/cron.* 下是否存在相关脚本。
二、使用 systemd-tmpfiles 统一管理(Ubuntu 16.04+ 推荐)
- 查看与调整定时器:默认每天运行一次(OnBootSec=15min;OnUnitActiveSec=1d)。如需改为每 3 分钟 清理一次,执行:
sudo systemctl edit --full systemd-tmpfiles-clean.timer
将 OnUnitActiveSec= 改为 3min,保存后执行:
sudo systemctl daemon-reload && sudo systemctl enable --now systemd-tmpfiles-clean.timer
查看状态与下次运行时间:
systemctl status systemd-tmpfiles-clean.timer
systemctl list-timers | grep tmpfiles
- 配置文件与规则:核心规则位于 /usr/lib/tmpfiles.d/tmp.conf,可被 /etc/tmpfiles.d/*.conf 覆盖。常见默认规则:
v /tmp 1777 root root 10d
v /var/tmp 1777 root root 30d
含义:/tmp 中超过 10 天 未被访问的文件会被删除,/var/tmp 为 30 天;1777 含 sticky bit,保证非属主不能误删他人文件。可按需调整保留天数(如将 10d 改为 5d)。
- 手动触发与验证:
sudo systemd-tmpfiles --clean
查看清理日志:
journalctl -u systemd-tmpfiles-clean
- 为自定义目录添加清理规则(示例):
新建 /etc/tmpfiles.d/my-tmp.conf:
d /opt/app/tmp 1750 app app 1h # 超过 1 小时删除
D /opt/scratch 1750 root root # 执行 --clean 与 --remove 时均删除(慎用)
说明:类型 d 会在不存在时创建目录;类型 D 更激进,配合 --remove 会删除目录本身。修改后执行 systemd-tmpfiles --create 使目录就位,随后由定时器自动清理。
三、旧版 Ubuntu 或未使用 systemd 的替代方案
- 使用 tmpreaper(Debian/Ubuntu 常见):
安装:sudo apt-get install tmpreaper
示例(删除 /tmp 中超过 24 小时 的文件,保留保护目录):
sudo tmpreaper 24h /tmp
配置文件:/etc/tmpreaper.conf(可按需排除目录)。
- 使用 cron 自定义脚本(通用):
示例(每天 3 点清理 /tmp 中 2 天前的文件):
0 3 * * * /usr/bin/find /tmp -mindepth 1 ( ! -user root ) -mtime +2 -delete
提示:尽量使用非 root 的精细化条件,避免误删系统/服务临时文件。
四、安全与排错要点
- 不要粗暴执行 rm -rf /tmp/*,可能删除正在使用的锁文件/套接字,导致服务异常;优先使用 systemd-tmpfiles 或 tmpreaper 等带安全策略的工具。
- 注意区分目录类型:/tmp 通常存放短期临时文件(默认 10 天),/var/tmp 用于跨重启的临时文件(默认 30 天),策略应不同。
- 若 /tmp 挂载为 tmpfs(内存文件系统),重启后内容会自动丢失,无需额外清理;若需确保重启即清空,可配置为 tmpfs 挂载。
- 预览要删除的内容再执行:例如先用 find /tmp -atime +7 -ls 查看,再替换为 -delete;对关键目录使用排除规则(如 systemd 的 x/X 排除项)。
- 查看与验证:
查看定时器与日志:systemctl list-timers | grep tmpfiles;journalctl -u systemd-tmpfiles-clean
检查 /tmp 空间:df -h /tmp;du -sh /tmp。