linux临时文件管理核心是用systemd-tmpfiles实现声明式清理:/tmp默认10天未访问即清(tmpfs则重启清空),/var/tmp保留至少30天且不被日常清理覆盖,需人工或应用主动管理。

Linux 系统中管理临时文件,核心是区分存放位置、理解清理机制、并主动配置而非被动等待。现代 systemd 系统已不再依赖手工脚本或 cron + rm,而是通过 systemd-tmpfiles 实现声明式、可审计、安全的统一管理。
/tmp 与 /var/tmp 的分工要清楚
两者用途不同,不能混用:
- /tmp:面向短期、进程级临时数据(如编译中间文件、GUI socket、临时下载)。默认清理策略为“10 天未访问(atime)即清”,但若挂载为 tmpfs(内存盘),则每次重启自动清空,不走定时清理流程。
- /var/tmp:设计为“跨重启保留”,用于需长期暂存的临时内容(如安装程序缓存、数据库导出中转)。标准建议保留至少 30 天,且默认不被日常清理覆盖——这意味着它更易堆积,必须特别关注。
清理靠 systemd-tmpfiles,不是 cron 或 rm -rf
Ubuntu 22.04+、RHEL/CentOS 8+、Debian 11+ 等主流发行版均启用 systemd-tmpfiles-clean.timer,每天自动执行清理。验证方式:
- 运行
systemctl list-timers | grep tmpfiles,确认 timer 处于 active 状态; - 查看配置来源:
systemd-tmpfiles --cat-config | grep -E "(tmp|var.*tmp)"; - 手动触发一次预览:
sudo systemd-tmpfiles --clean --dry-run,观察哪些路径会被处理。
⚠️ 切勿自行写 cron 脚本执行 rm -rf /tmp/*:可能误删正在被进程占用的 socket、pid 文件,导致服务中断;也无法跳过挂载点或尊重排除规则。
按需定制清理策略,用 /etc/tmpfiles.d/ 配置
所有自定义规则应写入 /etc/tmpfiles.d/(优先级高于系统默认的 /usr/lib/tmpfiles.d/),例如:
- 将 /tmp 清理周期从默认 10 天改为 7 天:
echo "d /tmp 1777 root root 7d" | sudo tee /etc/tmpfiles.d/tmp.conf - 保护应用专属目录不被清理(如
/tmp/myapp-cache):echo "X /tmp/myapp-cache" | sudo tee -a /etc/tmpfiles.d/tmp.conf
注意:X表示完全跳过该路径(含子项),x仅跳过自身、仍会进入子目录检查。 - 为应用创建专用临时目录并设权限:
echo "d /var/tmp/myapp 1775 myapp myapp 30d" | sudo tee /etc/tmpfiles.d/myapp.conf
运维与开发协同要点
光靠系统配置不够,还需配合操作习惯和代码规范:
- 权限必须正确:
sudo chmod 1777 /tmp /var/tmp(粘滞位确保用户只能删自己创建的文件); - 清理前先查占用:
lsof +D /var/tmp或fuser -v /var/tmp,避免强制删除仍在使用的文件; - 应用开发应优先调用
mkstemp()创建唯一临时文件,并在退出前显式unlink(),不依赖目录级批量清理; - 定期检查磁盘使用:
df -h /tmp /var/tmp,对 /var/tmp 尤其警惕——它不像 /tmp 那样重启即空,容易因积累触发空间告警。











