现代Linux默认使用systemd-tmpfiles清理/tmp,而非cron或rm -rf;其通过systemd-tmpfiles-clean.timer定时执行,依据/etc/tmpfiles.d/下配置(如d /tmp 1777 root root 7d)按atime清理过期文件,并支持X/x规则排除路径,--dry-run可预览效果。

systemd-tmpfiles 是默认清理机制,别碰 cron 或 rm -rf
现代 Linux(Ubuntu 22.04+、CentOS/RHEL 8+、Debian 11+)默认用 systemd-tmpfiles 管理 /tmp,不是靠 cron 脚本或手动 rm。硬写 cron 清理反而可能和 systemd 冲突,删掉正在被进程使用的 socket 或 pid 文件,导致服务中断。
确认你走的是这条路:
- 运行
systemctl list-timers | grep tmpfiles,应看到systemd-tmpfiles-clean.timer处于 active 状态 - 运行
mount | grep /tmp,如果输出含tmpfs,说明重启即清空——此时 systemd 清理只对非 tmpfs 场景生效(比如 /tmp 挂在普通磁盘上) - 配置优先级:系统默认规则在
/usr/lib/tmpfiles.d/tmp.conf,你自定义的应放/etc/tmpfiles.d/下(后者覆盖前者)
修改清理天数:改 /etc/tmpfiles.d/tmp.conf,不是直接删文件
想把默认 10 天改成 7 天?不要改 /usr/lib/tmpfiles.d/tmp.conf(会被包管理器覆盖),而是新建或编辑 /etc/tmpfiles.d/tmp.conf:
sudo tee /etc/tmpfiles.d/tmp.conf <p>注意这行含义:</p>
-
d表示“清理目录内容”,不是删目录本身 -
1777是权限(含粘滞位),确保用户只能删自己创建的文件 -
7d指“7 天内未访问(atime)的文件/子目录才清理”——systemd-tmpfiles --clean默认按 atime 判断,不是 mtime
改完不用重启服务,下次定时任务(或手动运行 systemd-tmpfiles --clean)就生效。
排除特定子目录不被清理:用 x 或 X 类型
比如你的应用把临时解压包放在 /tmp/myapp-cache,不想被自动删,加一条排除规则:
sudo tee -a /etc/tmpfiles.d/tmp.conf <p><code>X</code> 和 <code>x</code> 的区别很关键:</p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill10918" title="Linux Security Scanner"><img src="https://img.php.cn/upload/skill/001/246/273/6adaf20cf0281539.jpg" alt="Linux Security Scanner" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/skill10918" title="Linux Security Scanner" class="overflowclass">Linux Security Scanner</a> <p class="overflowclass">Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...</p> </div> <a rel="nofollow" href="/xiazai/skill10918" title="Linux Security Scanner" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div>
-
X /tmp/myapp-cache:完全跳过该路径,不进目录、不检查子项 -
x /tmp/myapp-cache:进入该目录,但不清理它自身;其下子目录仍可能被清理(除非再加规则)
常见误配:x /tmp/systemd-private-* 写成 x /tmp/systemd-private-* ——通配符在 tmpfiles 配置里不生效,必须写具体路径或用 %m 占位符(如 X /tmp/systemd-private-%m-*)
手动触发或验证清理行为:用 --dry-run 先看效果
别等定时任务跑完才发现删错了。用 --dry-run 模拟执行:
sudo systemd-tmpfiles --clean --dry-run /etc/tmpfiles.d/*.conf
它会列出所有将被删除的路径(不含实际动作)。如果输出为空,检查:
- 是否真有满足 age 条件的文件(比如刚创建的文件不会被列出来)
- 是否用了
atime但系统挂载/tmp时加了noatime(此时systemd-tmpfiles退而使用mtime,但文档未明说,行为可能不一致) - 是否漏写了
age字段(如写成d /tmp 1777 root root,则无清理逻辑)
真正要删,用 sudo systemd-tmpfiles --clean,它只处理配置中声明了 age 的条目,不会扫全盘。
最易被忽略的点:清理依据是 atime,但很多系统默认禁用 atime 更新(为性能),这时 systemd-tmpfiles 实际行为可能偏离预期,且无法通过配置切换判断依据。要么接受这个现实,要么确保关键临时目录用 X 显式排除。










