/tmp临时目录定期清理机制

备注

众所周知,Linux系统会定时清理 /tmp 临时目录下的不使用(访问)文件。但是,可能不太关注清理周期和清理配置。

很久以前,曾经有同事问过我这个问题,当时我特意去google并了解清理机制。最近,又遇到一个哭笑不得的线上异常,有程序在 /tmp 目录下存储几十G的临时日志(可能有十数万小文件),导致 /tmp 目录撑爆了系统 / 根目录影响了系统服务运行。所以,我在原学习笔记基础上再次整理和解决上述问题。

备注

如果系统根目录被打爆,则会影响很多系统服务运行。如果一时找不到那些文件占用了系统磁盘,则可以首先尝试 journalctl 快速缩小系统日志占用空间,然后尝试用 ncdu磁盘使用排查工具 定位占用磁盘空间的目录和文件再进行清理。本文就是使用这个流程找到 /tmp 大量占用空间,然后采用本文自动清理机制完成系统根目录清理和保持。

CentOS/RHEL 7/8 清理 /tmp 机制

从 CentOS/RHEL 7开始,采用 systemd-tmpfile 服务来周期性清理 /tmp 目录。配置文件是 /usr/lib/tmpfiles.d/tmp.conf ,针对上文 /tmp 目录被临时文件堵塞问题,如果确实不需要保留长时间(10天)临时文件,可以采用将 /tmp 目录保留文件配置修订成 2 天:

systemd-tmpfile服务配置定时清理临时文件
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

# See tmpfiles.d(5) for details

# Clear tmp directories separately, to make them easier to override
#q /tmp 1777 root root 10d
q /tmp 1777 root root 2d
q /var/tmp 1777 root root 30d

# Exclude namespace mountpoints created with PrivateTmp=yes
x /tmp/systemd-private-%b-*
X /tmp/systemd-private-%b-*/tmp
x /var/tmp/systemd-private-%b-*
X /var/tmp/systemd-private-%b-*/tmp

# Remove top-level private temporary directories on each boot
R! /tmp/systemd-private-*
R! /var/tmp/systemd-private-*
  • 重启 systemd-tmpfiles-clean.service 服务:

    systemctl restart systemd-tmpfiles-clean.service
    

重启以后,可以看到 /tmp 目录占用空间大为缩小,从原先 25G 缩减到 5.9G ,而且能够确保持续清理

  • systemctl status systemd-tmpfiles-clean.service 可以看到,该服务实际上是一个命令行:

    /usr/bin/systemd-tmpfiles --clean
    

实际上手工执行该命令也能清理 /tmp 目录(根据配置)

  • 周期性调用 systemd-tmpfiles-clean.service 是通过 systemd 的一个计时器配置 systemd-tmpfiles-clean.timer 完成的,这个计时器在系统启动时就会运行,定时会调用 systemd-tmpfiles-clean.service 完成临时文件清理

CentOS/RHEL 6 清理 /tmp 机制

CentOS/RHEL 6需要安装一个名为 tmpwatch 的工具来自动处理 /tmp 目录下的过期文件。这个工具包通常会安装,但是如果你的系统是最小化安装,则可能没有这个工具。

  • 安装 tmpwatch

    sudo yum install tmpwatch
    

安装了这个 tmpwatch 工具包之后。cronjob的配置目录中会增加一个 /etc/cron.daily/tmpwatch 定时任务配置文件,内容如下:

tmpwatch工具脚本,可修订脚本缩短清理周期
#! /bin/sh
flags=-umc
/usr/sbin/tmpwatch "$flags" -x /tmp/.X11-unix -x /tmp/.XIM-unix \
	-x /tmp/.font-unix -x /tmp/.ICE-unix -x /tmp/.Test-unix \
	-X '/tmp/hsperfdata_*' -X '/tmp/.hdb*lock' -X '/tmp/.sapstartsrv*.log' \
	#-X '/tmp/pymp-*' 10d /tmp
	-X '/tmp/pymp-*' 2d /tmp
/usr/sbin/tmpwatch "$flags" 30d /var/tmp
for d in /var/{cache/man,catman}/{cat?,X11R6/cat?,local/cat?}; do
    if [ -d "$d" ]; then
	/usr/sbin/tmpwatch "$flags" -f 30d "$d"
    fi
done

不同发行版的 /tmp 清理配置

根据不同发行版,提供了不同的清理 /tmp 配置方法:

  • Ubuntu 14: 通过 /etc/cron.daily 定时调用 tmpreaper 清理 /tmp 谬,配置位于 /etc/default/rcS/etc/tmpreaper.conf

  • Ubuntu 16: 使用 tmpfiles.d

  • 其他Debian系统: 启动时在 /etc/default/rcS 定义清理规则

  • RedHat系列系统见上文

  • Gentoo 通过 /etc/conf.d/bootmisc 配置

参考