在日常运维银河麒麟V10系统的过程中,有一个容易被忽视却又非常常见的问题:/tmp目录下的临时文件是否会在系统重启时被自动清空?表面上看,系统的默认行为就是重启时清理,但当你需要保留跨会话的调试日志,或者某些应用持续生成的中间文件时,这种默认机制反而成了麻烦。因此,核心问题在于:如何精准控制临时文件的“过期时间”,让它完全按照你的需求决定去留。这看似小事一桩,但如果策略选错,要么磁盘空间被撑爆,要么刚写入的数据就瞬间消失。

先说第一种最直接的方法——修改 TMPTIME 参数。该参数位于 /etc/default/rcS 文件中,它只影响系统启动时的清理行为。如果你将其设为 7,则系统重启时仅清空那些7天前创建的临时文件;设为 -1 则意味着永久保留,系统启动时不做任何清理。操作非常简单:用编辑器打开该配置文件,找到或新建一行 TMPTIME=0,将其改为你需要的数值即可。有一点需要特别注意:这个改动只有在下一次重启后才会生效,当前正在运行的文件不受任何影响。因此,别指望改了之后立刻看到变化。
用systemd-tmpfiles为/var/tmp等路径单独设有效期
如果说 TMPTIME 是一把大刀,那么 systemd-tmpfiles 就是一把精细的手术刀。尤其当你需要为 /var/tmp 或某个自定义路径(例如 /data/temp)制定独立的清理规则时,它的优势会完全展露出来。
具体如何操作?创建一条自定义规则文件即可。举个例子:echo 'v /var/tmp 1777 root root 30d' | sudo tee /etc/tmpfiles.d/custom-vartmp.conf。这个命令中的 30d 就是关键参数,表示清理30天前未被访问的文件。你也可以根据实际需求改为 7d、1h,甚至更精细的时间单位。需要明确的是,这种方法只针对你指定的路径,不会影响系统默认的 /tmp 清理行为。如果你想立即验证规则是否生效,可以使用 sudo systemd-tmpfiles --create /etc/tmpfiles.d/custom-vartmp.conf 直接触发一次清理。值得注意的是,系统默认规则位于 /usr/lib/tmpfiles.d/,其优先级低于 /etc/tmpfiles.d/,因此自定义配置会覆盖同名路径的默认行为。
通过tmpreaper实现按小时粒度清理/tmp
但如果你需要的不是按天、按周,而是按小时甚至分钟级的清理粒度——比如,希望每2小时清理一次超过4小时的临时文件——那么前面两种方法就显得力不从心了。此时,tmpreaper 是最佳选择。它不依赖系统重启,完全由定时任务驱动。
安装工具非常简单:sudo apt install tmpreaper。安装后可以先运行 sudo tmpreaper 12h /tmp 手动执行一次测试,看看哪些文件会被清理。确认无误后,写入一个定时任务即可:echo '0 1 * * * /usr/bin/tmpreaper 12h /tmp' | sudo tee -a /var/spool/cron/crontabs/root,然后重启 cron 服务。这样每天凌晨1点,系统就会自动清理掉12小时前的文件。
最后提醒一点,tmpreaper 默认会跳过正在被进程占用的文件,安全性远高于简单粗暴的 find -delete 命令。当然,它也有局限性——无法处理硬链接或符号链接指向的文件。不过,在绝大多数临时文件管理的场景中,这个工具已经足够可靠。
