linux中/tmp目录的自动清理由systemd-tmpfiles-clean.timer每日触发,依据/tmp.conf规则(如10d保留期)执行,仅清理超期且未被进程占用的普通文件和空目录,排除tmpfs、打开文件及配置指定路径。

Linux 中 /tmp 目录的自动清理不是内核行为,而是由用户空间服务按策略执行的管理动作。它既不“用完即删”,也不“永不清理”,而是在时间、挂载类型和系统配置共同约束下运行。
systemd-tmpfiles-clean 是现代主流机制
绝大多数当前发行版(Ubuntu 20.04+、RHEL/CentOS 7+、Debian 10+、Fedora 等)依赖 systemd-tmpfiles-clean.timer 每日触发清理。该 timer 默认调用 systemd-tmpfiles --clean,依据 /usr/lib/tmpfiles.d/tmp.conf(或 /etc/tmpfiles.d/ 下覆盖配置)中定义的规则执行。
典型规则如:d /tmp 1777 root root 10d
表示:对 /tmp 目录启用清理,保留 10 天内至少被访问(atime)或修改(mtime)过的文件;超期且无进程占用的文件/子目录将被删除。
清理实际生效的几个关键前提
-
/tmp若为 tmpfs(内存挂载),重启即清空,systemd-tmpfiles-clean不会对其执行磁盘级清理 - 文件正被进程打开时,即使超期也不会删除(Linux unlink 语义:句柄有效,空间待进程释放后回收)
- 配置中明确排除的路径(如
/tmp/.X11-unix、/tmp/systemd-private-*)不会被扫描或删除 - 清理仅作用于满足条件的普通文件与空目录,不递归强制删除非空子树
定制清理策略的推荐方式
- ✅ 优先修改配置文件:在
/etc/tmpfiles.d/tmp.conf中覆盖默认规则(如改为7d或3d),然后运行:sudo systemd-tmpfiles --create(同步创建/权限设置)sudo systemctl restart systemd-tmpfiles-clean.timer(使定时任务读取新配置) - ✅ 排除特定子路径:添加行如
x /tmp/myapp-cache - - - 30d(x表示“排除此路径下所有内容”,不清理) - ✅ 为应用设专用临时目录:在
/etc/tmpfiles.d/myapp.conf中定义:d /var/tmp/myapp 1775 myapp myapp 7d
自动创建目录、设权限、并独立控制生命周期
不推荐的手动替代方案
- ❌ 直接
rm -rf /tmp/*:可能误删正在使用的 socket、锁文件或容器 runtime 数据,引发服务中断 - ❌ 单独写 cron 脚本调用
find ... -delete:绕过systemd-tmpfiles的挂载点检测、排除规则和安全判断,易出错且不可审计 - ❌ 修改
TMPTIME(旧 SysVinit 参数):在 systemd 系统中已失效,不起作用
验证与调试方法
- 查看当前生效配置:
systemd-tmpfiles --cat-config | grep -A2 '/tmp' - 手动模拟清理(只显示将删什么,不真删):
sudo systemd-tmpfiles --clean --dry-run - 检查 timer 状态与下次运行时间:
systemctl list-timers | grep tmpfiles - 查看最近清理日志:
journalctl -u systemd-tmpfiles-clean -n 20 --since "2 days ago"
本质上,/tmp 的清理是可配置、可审计、有边界的安全操作,不是黑盒行为。合理利用 tmpfiles.d 体系,比任何脚本都更稳定、更兼容、更贴近系统设计意图。











