当前位置:首页 > 文章列表 > 文章 > linux > systemd-tmpfiles 清理前怎么用 dry-run 看将要删除的路径

systemd-tmpfiles 清理前怎么用 dry-run 看将要删除的路径

来源:17golang原创 2026-10-13 10:14:28 0浏览 收藏

如果你想知道 systemd-tmpfiles 清理前会命中哪些路径,先用 --clean --dry-run 做预演。它会读取配置、按 age 条件计算候选项并打印将执行的操作,但不会实际修改文件系统。确认路径、保留期限和退出状态都符合预期后,才考虑去掉 --dry-run。

官方地址:https://www.freedesktop.org/software/systemd/man/latest/systemd-tmpfiles.html

这篇文章只讨论按时间清理的预演,不把预演结果当作本机已经执行过的证据。重点边界是:--clean 看带年龄字段的规则,--remove 执行 r/R 删除规则,--purge 则面向命令行指定配置里带 $ 标记的创建项。

先确定 dry-run 的目标和边界

--dry-run 的作用是“处理配置并打印本来会执行的操作”,不是列出目录树,也不是把系统当前所有旧文件都列出来。只有与本次命令、配置规则和清理条件同时匹配的内容,才会进入预演输出。

对按时间清理来说,最小的命令形态是:

# 只预演按 age 条件命中的清理动作,不修改文件系统
sudo systemd-tmpfiles --clean --dry-run

# 如果只想研究一份明确的配置,用配置文件限制输入范围
sudo systemd-tmpfiles --clean --dry-run /etc/tmpfiles.d/example-cache.conf

第一条会按 systemd-tmpfiles 的默认配置搜索范围处理系统规则;第二条把输入收窄到显式文件。生产环境首次调整规则时,优先使用第二种方式,先确认配置文件本身和路径归属,再决定是否扩大范围。

systemd-tmpfiles配置目录优先级、同名覆盖、age字段与清理候选路径的静态关系图
图1:结构图。配置目录优先级、同名文件覆盖和 age 字段共同决定 --clean 的候选范围;这是静态说明图,不是终端截图或运行结果。

全流程总览:配置、规则、预演、决策

把一次安全的清理预演拆成四个阶段,排查时就不会只盯着命令参数:

阶段目标关键动作检查点
配置定位知道规则从哪里来查看 tmpfiles.d 目录、同名文件和规则类型没有把 vendor 配置误当成本地覆盖
规则确认判断是否属于 --clean检查路径、类型、age 字段目标规则确实带有保留期限
预演输出看到将要执行的动作运行 --clean --dry-run路径和年龄条件都在预期范围
正式决策决定是否真正清理保留同一参数,仅去掉 --dry-run退出码为 0,且没有未知路径

这个顺序的核心是“先确认输入,再解释输出”。如果只执行 dry-run 却没有确认加载了哪份配置,看到一串路径也不能说明它们属于你的业务缓存。

阶段一:定位真正生效的 tmpfiles.d 配置

systemd-tmpfiles 会从多个 tmpfiles.d 目录读取规则。常见的系统级目录包括 /etc/tmpfiles.d/、/run/tmpfiles.d/、/usr/local/lib/tmpfiles.d/ 和 /usr/lib/tmpfiles.d/。同名文件不是叠加读取,而是由优先级更高的目录版本取代低优先级版本;不同文件则共同参与后续处理。

可以先查看目标文件和相同基名的覆盖情况:

# 按同一个配置基名查找可能的覆盖文件,只读不改动
find /etc/tmpfiles.d /run/tmpfiles.d /usr/local/lib/tmpfiles.d /usr/lib/tmpfiles.d \
  -maxdepth 1 -type f -name 'example-cache.conf' -print 2>/dev/null

# 查看生效配置内容,重点关注规则类型、路径和 age 字段
sed -n '1,160p' /etc/tmpfiles.d/example-cache.conf

如果命令行直接写的是一个带斜杠的路径,systemd-tmpfiles 会直接使用该文件;如果只写文件名,则会在配置目录中寻找优先级最高的同名文件。排查时应把这两种调用方式分开,否则容易以为改了 /etc 文件,实际却执行了另一份显式路径配置。

阶段二:确认 --clean 只关心 age 规则

--clean 的判断依据是规则中的年龄字段。下面的配置片段只作为解释字段含义的最小示例:

# d 表示目录,最后的 7d 表示按年龄判断目录内容
d /var/cache/example-service 0750 root root 7d

# 目录内超过保留期限的内容才会成为 --clean 的候选
# 不要把没有 age 的创建规则当成按时间清理规则

示例中的 7d 不是“目录创建七天后整个目录必然消失”,而是该规则用于清理时的年龄条件。最终候选还受路径、文件类型、权限以及 systemd-tmpfiles 对规则的解释影响。预演的价值,就是把这些条件交给同一套工具计算,而不是用 find -mtime 猜测。

如果规则没有 age 字段,--clean 通常没有可按时间判断的对象;这时应回到配置设计确认需求,而不是为了得到输出随意补一个删除参数。

阶段三:运行预演并读懂将要删除的路径

确认输入后,使用正式命令的同一组选项运行预演。只把 --dry-run 加上,不要同时改变配置文件、路径前缀或清理模式:

# 用与正式清理相同的模式预演,避免测试命令和上线命令不一致
sudo systemd-tmpfiles --clean --dry-run /etc/tmpfiles.d/example-cache.conf

# 需要更多诊断信息时提高日志级别,但仍保持 dry-run
sudo SYSTEMD_LOG_LEVEL=debug systemd-tmpfiles --clean --dry-run \
  /etc/tmpfiles.d/example-cache.conf

读输出时至少核对三项:

  • 路径:是否只落在目标服务的缓存、临时目录或日志目录,是否出现了不认识的系统路径。
  • 规则条件:路径是否来自预期的 age 规则,而不是把 r/R 删除规则误认为按时间清理。
  • 退出状态:成功通常返回 0;语法错误、权限不足或执行条件不满足时要按非零状态处理。
systemd-tmpfiles clean dry-run输出需要核对路径、年龄条件和退出状态的静态关系图
图2:关系图。dry-run 输出需要同时对照路径、age 条件和退出状态,再决定是否进入正式清理;这是静态说明图,不表示真实执行结果。

一个实用的判断规则是:路径不认识、规则来源不清楚或退出码非零,三者任意一个出现,就先停在预演阶段。不要把“命令打印了内容”理解成“这些内容已经可以安全删除”。

阶段四:选择正式动作并保持参数一致

预演确认无误后,正式动作只应去掉 --dry-run,保留同一配置文件和其它筛选选项:

# 只有确认预演路径后才进入正式清理;配置和模式保持不变
sudo systemd-tmpfiles --clean /etc/tmpfiles.d/example-cache.conf

但“去掉 dry-run”不等于任何场景都应该使用 --clean。三个动作的边界可以这样记:

动作主要判断依据适用问题不应替代
--clean规则中的 age按保留时间清理目录内容明确的 r/R 删除规则
--remove规则类型 r/R执行配置声明的移除动作按时间轮转旧文件
--purge指定配置中的创建项和 $ 标记软件包卸载时清理包声明的对象日常 /tmp 清理

尤其不要用宽泛的 rm -rf 代替 tmpfiles 规则。那会绕过配置的路径边界、年龄条件和文件类型判断,使预演结果失去意义。

常见误区:为什么预演结果和预期不一样

  • 把 --dry-run 当目录扫描。 它展示的是规则将执行的操作,不是所有“看起来很旧”的文件。
  • 只看文件名,不看覆盖关系。 同名文件可能由更高优先级目录版本生效,先确认来源再读内容。
  • 把没有 age 的规则交给 --clean。 没有保留期限就没有按时间判断的基础,应修正规则目标。
  • 用测试命令替代正式命令。 预演时如果换了配置、模式或路径范围,输出不能代表正式清理。
  • 忽略非零退出码。 语法错误和权限问题都可能让部分规则没有按预期处理,不能把剩余输出当作完整结果。
  • 把 --purge 当作 --clean。 一个面向带 $ 的创建项,一个面向 age 条件,输入和风险边界都不同。

速查表:从目标到安全命令

你的目标先看什么预演命令方向可以进入正式执行的条件
按保留时间清理缓存规则路径和 agesystemd-tmpfiles --clean --dry-run FILE路径属于目标服务,退出码为 0
执行明确的删除规则规则类型是否为 r/Rsystemd-tmpfiles --remove --dry-run FILE确认删除规则和范围后再去掉 dry-run
卸载包时清理包创建对象$ 标记和包提供的配置systemd-tmpfiles --purge --dry-run FILE只命中包声明对象,且显式指定配置

最后把流程压缩成一句话:先找生效配置,再确认规则类型和 age,然后用与正式命令一致的参数做 dry-run;只有路径、条件和退出码都清楚,才进入真正的文件清理。

相关问题

systemd-tmpfiles --clean --dry-run 会删除文件吗?

不会。官方定义是处理配置并打印将执行的操作,不实际改变文件系统;它的输出用于清理前复核。

为什么 dry-run 没有列出我认为很旧的文件?

先检查文件所在路径是否被规则覆盖、规则是否带 age,以及本次命令是否读取了你修改的那份配置。文件“很旧”本身不是 tmpfiles 的匹配条件。

是否应该总是显式写配置文件?

首次排查或上线新规则时,显式写目标配置更容易控制范围;如果确实要评估系统全局清理,则应先明确默认配置搜索范围和预演输出,再决定是否执行。

systemd 版本较旧时不认识 --dry-run 怎么办?

--dry-run 属于较新的选项,官方手册标注其从 systemd 256 起提供。旧环境应先确认实际版本和发行版支持范围,不要用删除命令冒充预演。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
tmpfiles.d 的用户级配置和系统级配置有什么区别tmpfiles.d 的用户级配置和系统级配置有什么区别
上一篇
tmpfiles.d 的用户级配置和系统级配置有什么区别
udevadm settle 超时退出时怎么判断设备事件是否还没处理完
下一篇
udevadm settle 超时退出时怎么判断设备事件是否还没处理完
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    455次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    521次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    536次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    483次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    304次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议 和 隐私政策
返回登录
  • 重置密码