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

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

来源:17golang原创

时间:2026-10-13 10:14:28 342浏览 收藏

如果你想知道 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删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>