/tmp 和 /var/tmp 不自动即时清理,而是依发行版配置定期处理:/tmp 默认10天未访问文件由 systemd-tmpfiles-clean.timer 每日清理,/var/tmp 通常保留30天以上且不被日常清理覆盖。

/tmp 和 /var/tmp 不是“用完就自动消失”的目录,系统不会在文件写入后立刻清理,而是按策略定期处理。是否清理、何时清理、清理哪些内容,取决于发行版配置和管理员干预,不是内核或文件系统自发行为。
/tmp 的实际清理机制
多数现代 Linux(systemd 系统)通过 systemd-tmpfiles-clean.timer 每天执行清理,默认清除 10 天未访问的文件。但有几种常见例外:
- 若 /tmp 是 tmpfs(内存挂载),重启即清空,无需依赖定时任务
- 某些发行版(如旧版 RHEL/CentOS 6)使用 cron + tmpwatch,配置在 /etc/cron.daily/tmpwatch
- 被排除的路径(如 /tmp/.X11-unix)不会被清理,即使超期
- 文件被进程打开占用时,即使过期也不会删除(Linux 的 unlink 语义:文件句柄仍有效,磁盘空间待进程释放后才回收)
/var/tmp 的保留逻辑与风险点
/var/tmp 设计为“跨重启临时存储”,标准建议保留至少 30 天,通常不被日常清理覆盖。这意味着:
- 它的内容可能长期滞留,尤其当应用未主动清理自身生成的临时文件时
- 不像 /tmp 那样常驻内存,/var/tmp 一般位于磁盘分区,容易因积累过多导致空间告警
- systemd 配置中常见行:d /var/tmp 1777 root root 30d —— 表示创建目录并设权限,但不自动清空内容;真正触发清理的是 q 或 Q 类型规则
- 人工清理前建议先检查谁在用:lsof +D /var/tmp 或 fuser -v /var/tmp
安全与运维实操建议
别只等自动机制,主动管理更可靠:
- 确认权限正确:sudo chmod 1777 /tmp /var/tmp(sticky bit 防止用户删他人文件)
- 查看当前清理配置:systemd-tmpfiles --cat-config | grep -E "(tmp|var.*tmp)"
- 手动触发一次清理:sudo systemd-tmpfiles --clean(不加参数仅清理,不重建)
- 临时应急清理(慎用):sudo find /tmp -type f -mtime +10 -delete,但不如 systemd-tmpfiles 安全(跳过挂载点、尊重排除规则)
- 应用开发侧应优先用 mkstemp() 创建唯一临时文件,并在退出前显式 unlink(),避免依赖目录级清理
要不要自己写脚本定期清?
一般不需要。systemd-tmpfiles 已是标准方案,稳定且可审计。自行写 cron 脚本反而容易遗漏边界情况(如符号链接、挂载子目录、NFS 挂载点)。如确需定制,应在 /etc/tmpfiles.d/ 下添加配置文件(例如 myapp.conf),用 x 或 X 明确排除关键子路径,再用 q 设置老化时间。











