/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 天:
# 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
定时任务配置文件,内容如下:
#! /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
配置