登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  文章 >  linux

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 这类路径下的旧文件自动消失,都是这套机制按预设年龄阈值扫描执行的结果,完全可以通过修改规则自定义清理逻辑,也支持手动触发校验清理效果。
Linux systemd-tmpfiles 从规则文件到年龄判断再到临时文件清理结果的流程插画

规则从哪里来: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是否存在管理员覆盖
文件年龄statfind -printfmtime 是否越过规则阈值
执行入口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

如果定时器正常、规则也命中了,但文件仍在,常见原因是文件年龄还没超过阈值、路径被更具体规则覆盖,或它的类型并不属于该条规则。这个结果先别下结论,继续回到合并配置和单个文件的时间证据。

Linux 临时文件核对 mtime 与 tmpfiles 年龄阈值后显示保留或清理结果的二维工程插画

手动清理前的安全顺序:先审阅,再小范围验证

确认规则没有误伤后,才考虑执行清理。生产机器上建议先复制自定义规则,并把业务临时目录从 /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 和定时器日志解释文件状态,最后才在备份和可恢复的前提下执行清理,这个顺序比记住一条删除命令更可靠。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>