systemd-tmpfiles 清理前怎么用 dry-run 看将要删除的路径
如果你想知道 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 的默认配置搜索范围处理系统规则;第二条把输入收窄到显式文件。生产环境首次调整规则时,优先使用第二种方式,先确认配置文件本身和路径归属,再决定是否扩大范围。

全流程总览:配置、规则、预演、决策
把一次安全的清理预演拆成四个阶段,排查时就不会只盯着命令参数:
| 阶段 | 目标 | 关键动作 | 检查点 |
|---|---|---|---|
| 配置定位 | 知道规则从哪里来 | 查看 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;语法错误、权限不足或执行条件不满足时要按非零状态处理。

一个实用的判断规则是:路径不认识、规则来源不清楚或退出码非零,三者任意一个出现,就先停在预演阶段。不要把“命令打印了内容”理解成“这些内容已经可以安全删除”。
阶段四:选择正式动作并保持参数一致
预演确认无误后,正式动作只应去掉 --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 条件,输入和风险边界都不同。
速查表:从目标到安全命令
| 你的目标 | 先看什么 | 预演命令方向 | 可以进入正式执行的条件 |
|---|---|---|---|
| 按保留时间清理缓存 | 规则路径和 age | systemd-tmpfiles --clean --dry-run FILE | 路径属于目标服务,退出码为 0 |
| 执行明确的删除规则 | 规则类型是否为 r/R | systemd-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 起提供。旧环境应先确认实际版本和发行版支持范围,不要用删除命令冒充预演。
tmpfiles.d 的用户级配置和系统级配置有什么区别
- 上一篇
- tmpfiles.d 的用户级配置和系统级配置有什么区别
- 下一篇
- udevadm settle 超时退出时怎么判断设备事件是否还没处理完
-
- 文章 · linux | 51分钟前 |
- rsync 覆盖旧文件前怎么用 --backup-dir 留存变更版本
- 344浏览 收藏
-
- 文章 · linux | 53分钟前 | Linux · rsync --max-delete rsync --delete rsync 删除保护 Linux 镜像同步
- rsync 删除文件过多时怎么用 --max-delete 保护目标目录
- 321浏览 收藏
-
- 文章 · linux | 56分钟前 |
- ssh-add -h 怎么限制转发密钥只能用于指定主机
- 268浏览 收藏
-
- 文章 · linux | 56分钟前 | Linux · rsync --mkpath rsync目标目录 Linux文件同步 远程目录创建
- rsync 目标目录不存在时怎么用 --mkpath 自动创建路径
- 433浏览 收藏
-
- 文章 · linux | 59分钟前 |
- SSH ControlPath 怎么避免不同主机复用同一个 socket
- 446浏览 收藏
-
- 文章 · linux | 1小时前 |
- udevadm settle 怎么用设备文件作为提前结束条件
- 197浏览 收藏
-
- 文章 · linux | 1小时前 | Linux · 故障排查 · udevadm settle udev事件队列 udevadm timeout Linux设备事件
- udevadm settle 超时退出时怎么判断设备事件是否还没处理完
- 394浏览 收藏
-
- 文章 · linux | 1小时前 | Linux · tmpfiles.d systemd-tmpfiles Linux临时文件
- tmpfiles.d 的用户级配置和系统级配置有什么区别
- 160浏览 收藏
-
- 文章 · linux | 1小时前 | Linux systemd 配置优先级 tmpfiles.d 配置排查 systemd-tmpfiles --cat-config
- systemd-tmpfiles --cat-config 怎么查看最终采用的配置片段
- 411浏览 收藏
-
- 文章 · linux | 1小时前 | linux运维 · Linux 软件包卸载 tmpfiles.d systemd-tmpfiles
- systemd-tmpfiles --purge 怎么清理软件包创建的运行目录
- 340浏览 收藏
-
- 文章 · linux | 2天前 | linux运维 · Linux 日志清理 磁盘空间 journalctl systemd-journald
- journalctl vacuum-size 清理日志的保留策略
- 328浏览 收藏
-
- 文章 · linux | 2天前 |
- OpenSSH ControlMaster 复用连接的失效原因
- 278浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 455次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 521次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 536次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 483次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 304次使用
-
- Prometheus&Grafana性能监控
- 2023-01-26 106浏览
-
- 云计算-带你安装MySQL数据库并去除安全隐患
- 2023-01-14 411浏览
-
- 用service命令管理mysql启停
- 2023-02-23 209浏览
-
- Linux自动备份MySQL
- 2023-02-16 312浏览
-
- linux+nginx+mysql+php实用服务器配置教程
- 2023-01-14 441浏览

