/tmp清理机制
在 Linux 中,/tmp
目录用于存放临时文件,系统和应用程序在运行过程中会在该目录中创建临时数据。为了避免空间占满、旧文件堆积,Linux 系统通常会有一套机制对 /tmp
目录进行自动清理。这套机制会因发行版、系统配置、使用的 init 系统(如 systemd、SysVinit)而异。
下面是 /tmp
清理机制的详解:
一、常见的 /tmp
清理机制
1. 开机时清理(early boot cleanup)
某些 Linux 系统会在开机时自动清理 /tmp
目录中上次关机遗留的过期文件。
-
适用系统:部分基于
SysVinit
的老系统,如 CentOS 6、RHEL 6。 -
配置文件:
-
/etc/sysconfig/rcS
中可能有如下配置项:TMPTIME=0
TMPTIME=0
:每次开机都清理/tmp
TMPTIME=-1
:永不清理TMPTIME=7
:保留 7 天内访问过的临时文件
-
2. 定时任务(cron + tmpwatch / tmpreaper)
大多数老旧或轻量 Linux 系统使用 cron
定期执行 tmpwatch
或 tmpreaper
工具清理 /tmp
。
tmpwatch(RHEL/CentOS 常见)
-
清理逻辑:删除 n 小时未被访问 的文件
-
示例路径:
/etc/cron.daily/tmpwatch
-
示例脚本内容:
/usr/sbin/tmpwatch 240 /tmp
表示清理
/tmp
中 10 天(240 小时)未访问的文件。
tmpreaper(Debian/Ubuntu 常见)
- 更细化的规则,比如排除某些目录、使用白名单。
3. systemd-tmpfiles 机制(现代 systemd 系统)
现代系统(如 RHEL 7/8/9、CentOS 7/8、Ubuntu 20.04+、Debian 10+)中 /tmp
的清理通常由 systemd-tmpfiles
服务统一管理。
-
核心配置路径:
/usr/lib/tmpfiles.d/tmp.conf
/etc/tmpfiles.d/*.conf
(可覆盖)
-
示例配置内容:
#Type Path Mode UID GID Age Argument d /tmp 1777 root root 10d
d
: 目录类型1777
: 权限(sticky bit)10d
: 文件超过 10 天未被访问将被删除
-
查看清理规则:
systemctl status systemd-tmpfiles-clean.timer
-
手动触发清理:
systemd-tmpfiles --clean
二、判断你的系统使用了哪种清理机制
-
是否为 systemd 系统:
ps -p 1 -o comm=
- 输出为
systemd
→ 使用systemd-tmpfiles
- 输出为
init
→ 可能是旧式机制
- 输出为
-
查看定时器是否启用:
systemctl list-timers | grep tmpfiles
- 若有
systemd-tmpfiles-clean.timer
→ 表示已启用清理机制
- 若有
-
检查 cron 脚本:
cat /etc/cron.daily/tmpwatch
或:
find /etc/cron.* -name '*tmp*'
三、额外建议
-
不要手动频繁清空
/tmp
,可能会误删服务或程序临时文件。 -
若空间紧张,可临时清理:
find /tmp -type f -atime +10 -delete
删除 10 天未访问的文件
-
可以单独挂载
/tmp
分区并设置自动清理:- 在
/etc/fstab
中用tmpfs
或noexec,nosuid
限制
- 在
四、其他临时目录说明
目录 | 说明 |
---|---|
/tmp | 所有用户与系统程序的临时文件 |
/var/tmp | 临时但需跨重启保存的文件(清理周期较长) |
/dev/shm | 基于内存的临时文件系统(共享内存) |
是否需要我根据你当前的 Linux 发行版和版本帮你判断 /tmp
的清理机制?你可以贴上 cat /etc/os-release
的输出。
systemd-tmpfiles-clean.timer 说明
你这份 /usr/lib/tmpfiles.d/tmp.conf
表示你的系统采用了 systemd-tmpfiles
机制 来清理 /tmp
和 /var/tmp
,以下是解析说明和行为总结:
✅ 配置详解
v /tmp 1777 root root 10d
v /var/tmp 1777 root root 30d
v
:表示这是一个虚拟路径项,systemd 不会创建目录,只负责清理已有内容。/tmp
、/var/tmp
:分别指定清理路径。1777
:权限为 1777(即有 sticky bit 的 world-writable 目录,避免非属主文件被误删)。10d
:删除访问时间(atime)超过 10 天的文件。30d
:同理,/var/tmp
保留 30 天。
接下来的这些是排除规则:
x /tmp/systemd-private-%b-*
X /tmp/systemd-private-%b-*/tmp
x
/X
:表示排除的路径(不要清理)%b
:是 systemd 的变量,表示当前 boot ID。用于排除带有PrivateTmp
的服务所创建的临时私有目录。
🕒 清理机制运行方式
清理操作由 systemd-tmpfiles-clean.timer
定期触发:
查看是否启用清理计划:
systemctl status systemd-tmpfiles-clean.timer
查看计划任务的运行时间:
systemctl list-timers --all | grep tmpfiles
你应该能看到类似下面的输出:
NEXT LEFT LAST PASSED UNIT ACTIVATES
Tue 2025-07-02 00:00:00 CST 14h Tue 2025-07-01 00:00:01 CST 10min ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service
🧪 手动触发清理测试
你可以手动触发一次 /tmp
清理来验证效果(⚠️注意风险):
sudo systemd-tmpfiles --clean
如果想查看哪些文件会被清理,可以先 dry-run:
sudo systemd-tmpfiles --clean --remove
🔒 建议和提示
-
不要轻易修改
/usr/lib/tmpfiles.d/tmp.conf
,因为它可能被系统升级覆盖。 -
若需自定义,请在
/etc/tmpfiles.d/tmp.conf
中创建同名配置文件,修改如:v /tmp 1777 root root 3d
这会覆盖原来的
10d
配置,将/tmp
的保留时间改为 3 天。
是否需要我帮你定制 /etc/tmpfiles.d/tmp.conf
,或给出 /tmp
的清理调试日志查看方法?