Linux 临时文件为什么会自动清理:tmpfiles.d 规则、年龄阈值与手动验证
来源:17golang原创
时间:2026-08-27 07:34:34 126浏览 收藏
服务器上的临时文件并不是“重启就一定消失”,也不是由某个固定脚本统一删除。使用 systemd 的 Linux 主机通常由 systemd-tmpfiles 读取 tmpfiles.d 规则,再根据目录、文件类型和年龄阈值决定是否清理。排查时先看规则和实际文件年龄,再手动执行预览或清理,才能避免把仍在使用的缓存、上传中间件文件误当成垃圾。
- /usr/lib/tmpfiles.d、/run/tmpfiles.d、/etc/tmpfiles.d 的规则优先级不同,自定义规则应放在 /etc/tmpfiles.d。
- 规则中的年龄值决定清理边界;先用 stat 核对 mtime,不要只凭文件名判断“过期”。
systemd-tmpfiles --clean会按现有规则处理,变更前先做规则审阅并保留回滚副本。- /tmp 与 /var/tmp 的保留约定可能不同,业务目录不应直接套用临时目录策略。
先分清:重启清空和按年龄清理不是一回事
一次主机重启后 /tmp 变空,可能来自 tmpfs 挂载,也可能来自启动阶段的清理动作;/var/tmp 通常承担更长生命周期的临时数据,不能用同一条经验判断。真正要确认的是目录的挂载方式、规则文件和文件的修改时间。
可以先执行下面几条只读命令,建立基线:
findmnt /tmp /var/tmp
systemd-tmpfiles --cat-config
stat -c '%n mtime=%y size=%s' /tmp/example.cache
--cat-config 展示合并后的规则内容。输出里如果同时出现多个同名路径,先按来源目录判断覆盖关系,不要直接编辑发行版提供的文件。
Linux 发行版现在大多默认通过 systemd 自带的 tmpfiles 组件完成临时文件的自动清理,你看到的 /tmp、/var/tmp 这类路径下的旧文件自动消失,都是这套机制按预设年龄阈值扫描执行的结果,完全可以通过修改规则自定义清理逻辑,也支持手动触发校验清理效果。

规则从哪里来:tmpfiles.d 的路径和优先级
常见规则目录包括 /usr/lib/tmpfiles.d、/run/tmpfiles.d 和 /etc/tmpfiles.d。发行版或软件包通常写入 /usr/lib/tmpfiles.d,运行时生成内容可能位于 /run/tmpfiles.d,而管理员自己的覆盖规则放在 /etc/tmpfiles.d。对同一路径做调整时,优先使用 /etc/tmpfiles.d 下的同名文件或更明确的自定义文件,便于审计和撤销。
| 检查对象 | 命令或路径 | 要确认的结果 |
|---|---|---|
| 合并规则 | systemd-tmpfiles --cat-config | 目录、类型、年龄值是否符合预期 |
| 实际配置 | /etc/tmpfiles.d/*.conf | 是否存在管理员覆盖 |
| 文件年龄 | stat、find -printf | mtime 是否越过规则阈值 |
| 执行入口 | systemd-tmpfiles-clean.timer | 定时器是否启用、上次何时运行 |
用年龄阈值解释“为什么它还没被清掉”
规则中的 d、h、min 等时间单位描述保留时长,实际判断仍要结合规则类型和文件的时间属性。一个文件刚被读取过,并不代表 mtime 一定更新;反过来,应用重写文件也可能让它重新变“年轻”。因此排查要把规则行、文件 mtime 和扫描目录放在一起看。
find /tmp -xdev -type f -printf '%TY-%Tm-%Td %TH:%TM %s %p\n' | sort | head -30
systemctl status systemd-tmpfiles-clean.timer --no-pager
journalctl -u systemd-tmpfiles-clean.service -n 50 --no-pager
如果定时器正常、规则也命中了,但文件仍在,常见原因是文件年龄还没超过阈值、路径被更具体规则覆盖,或它的类型并不属于该条规则。这个结果先别下结论,继续回到合并配置和单个文件的时间证据。

手动清理前的安全顺序:先审阅,再小范围验证
确认规则没有误伤后,才考虑执行清理。生产机器上建议先复制自定义规则,并把业务临时目录从 /tmp 迁出;不要为了验证效果直接删除目录。
sudo cp -a /etc/tmpfiles.d /etc/tmpfiles.d.backup-20260827
sudo systemd-tmpfiles --clean
systemd-tmpfiles --cat-config | sed -n '1,160p'
执行完成后重新检查目录大小、关键文件和服务日志。需要立即恢复时,先恢复 /etc/tmpfiles.d 中的自定义文件,再重新加载相关服务;已被清理的文件不能靠重载规则找回,所以备份和业务侧重建方案都要提前准备。
常见误区与边界
- 把 /tmp 和 /var/tmp 当成同一种目录:两者的生命周期约定可能不同。
- 只看文件名中的日期:清理规则通常看文件属性和路径匹配,不会理解业务命名。
- 直接修改 /usr/lib/tmpfiles.d:软件升级可能覆盖改动,应把管理员策略留在 /etc/tmpfiles.d。
- 把缓存放在系统临时目录却没有重建逻辑:清理是允许发生的,服务要能在文件缺失时重新创建。
相关问题
systemd-tmpfiles 会删除正在打开的文件吗?
规则匹配的是文件路径和属性,不能把“进程仍打开”当成业务安全保证。重要数据应放在有明确生命周期和备份策略的目录中。
修改 tmpfiles.d 后需要重启服务器吗?
通常不需要为了规则生效而重启;先用 systemd-tmpfiles --cat-config 检查合并结果,再在维护窗口执行清理即可。
为什么文件访问过却没有变得更新?
读取文件不一定更新 mtime,程序也可能使用缓存或只改变 atime。应以规则实际采用的时间属性和 stat 输出为准。
总结
Linux 临时文件的自动清理是“规则 + 路径 + 年龄 + 定时入口”的组合行为。先用合并配置确认谁在管理目录,再用 stat 和定时器日志解释文件状态,最后才在备份和可恢复的前提下执行清理,这个顺序比记住一条删除命令更可靠。
-
426 收藏
-
387 收藏
-
242 收藏
-
238 收藏
-
402 收藏
-
482 收藏
-
189 收藏
-
301 收藏
-
489 收藏
-
304 收藏
-
484 收藏
-
405 收藏
-
252 收藏
-
462 收藏
-
134 收藏
-
351 收藏
-
492 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习