在一些现代Linux发行版中,tmpwatch已被tmpreaper取代。两个工具功能类似,但tmpreaper在某些系统上更常见。
tmpwatch(temporary watch的缩写)命令主要用于:
# RHEL/CentOS/Fedora
sudo yum install tmpwatch
# 或
sudo dnf install tmpwatch
# Ubuntu/Debian (使用tmpreaper)
sudo apt-get install tmpreaper
# 验证安装
tmpwatch --version
tmpwatch [选项] 时间 目录...
| 选项 | 说明 |
|---|---|
| -a, --all | 删除所有文件类型,包括目录和符号链接 |
| -c, --ctime | 基于文件状态改变时间而非访问时间 |
| -f, --force | 强制删除只读文件 |
| -l, --loop | 在后台循环运行(守护进程模式) |
| -m, --mtime | 基于文件修改时间 |
| -M, --dirmtime | 基于目录的修改时间 |
| -q, --quiet | 安静模式,不显示输出 |
| -r, --recursive | 递归删除目录(已废弃,默认启用) |
| -s, --fuser | 尝试使用fuser命令检查文件是否正在使用 |
| -t, --test | 测试模式,只显示将要删除的文件,不实际删除 |
| -u, --atime | 基于文件访问时间(默认) |
| -U, --exclude-user=用户 | 不删除指定用户的文件 |
| -v, --verbose | 详细模式,显示删除的文件 |
| -x, --exclude=路径 | 排除指定的路径模式 |
| -X, --exclude-pattern=模式 | 排除匹配模式的文件 |
| --protect=模式 | 保护匹配模式的文件不被删除 |
| --nosymlinks | 不跟随符号链接 |
| --noparent | 不删除父目录,即使为空 |
| --nodirs | 不删除目录,即使为空 |
| --nofiles | 不删除文件 |
| --help | 显示帮助信息 |
| --version | 显示版本信息 |
时间参数可以使用多种格式:
| 格式 | 示例 | 说明 |
|---|---|---|
| 数字 | 24 |
24小时 |
| 带单位 | 10d |
10天 |
| 组合 | 2w3d12h |
2周3天12小时 |
时间单位:s(秒),m(分钟),h(小时),d(天),w(周)
清理24小时内未被访问的文件:
tmpwatch 24 /tmp
使用 -t 选项预览将要删除的文件:
tmpwatch -t 48 /var/tmp
使用 -v 选项显示删除的文件:
tmpwatch -v 168 /tmp
使用 -m 选项基于文件修改时间:
tmpwatch -m 30d /cache
使用 -x 选项排除特定文件或目录:
tmpwatch -x '.important' 24 /tmp
使用 -U 选项保护特定用户的文件:
tmpwatch -U root 24 /tmp
使用 -s 选项避免删除正在使用的文件:
tmpwatch -s 24 /tmp
同时清理多个目录:
tmpwatch 72 /tmp /var/tmp /cache
定期清理系统临时目录:
# 清理24小时未访问的/tmp文件
tmpwatch 24 /tmp
# 清理7天未访问的/var/tmp文件
tmpwatch 7d /var/tmp
清理Web服务器缓存文件:
# 清理30天前的缓存文件
tmpwatch -m 30d /var/cache/nginx
tmpwatch -m 30d /var/cache/apache2
清理旧的应用程序日志:
# 清理90天前的日志文件
tmpwatch -m 90d /var/log/myapp
清理用户缓存和临时文件:
# 清理用户缓存目录
tmpwatch 30d /home/*/.cache
tmpwatch 30d /home/*/.tmp
设置cron任务定期运行tmpwatch:
# 编辑cron任务
sudo crontab -e
# 每天凌晨3点清理/tmp目录
0 3 * * * /usr/sbin/tmpwatch 24 /tmp
# 每周日清理/var/tmp目录
0 2 * * 0 /usr/sbin/tmpwatch 7d /var/tmp
在一些系统中,tmpwatch作为系统服务运行:
# 检查tmpwatch服务状态
systemctl status tmpwatch
# 查看服务配置
cat /etc/cron.daily/tmpwatch
cat /etc/tmpwatch.d/
-t 选项测试-s 选项避免删除正在使用的文件创建高级清理脚本:
#!/bin/bash
# advanced_cleanup.sh - 高级清理脚本
LOG_FILE="/var/log/cleanup.log"
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$TIMESTAMP] 开始清理操作" >> "$LOG_FILE"
# 清理临时目录
echo "清理/tmp目录..."
tmpwatch -v 24 /tmp >> "$LOG_FILE" 2>&1
# 清理缓存目录
echo "清理缓存目录..."
tmpwatch -m 30d /var/cache >> "$LOG_FILE" 2>&1
# 清理日志备份
echo "清理旧日志..."
find /var/log -name "*.log.*" -mtime +30 -delete >> "$LOG_FILE" 2>&1
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$TIMESTAMP] 清理操作完成" >> "$LOG_FILE"
使用 -l 选项在后台持续运行:
# 在后台持续监控和清理
tmpwatch -l -v 24 /tmp
# 查看后台进程
ps aux | grep tmpwatch
使用复杂的排除规则:
# 排除多个模式
tmpwatch -X '*.pid' -X '*.sock' -X '.X11*' 24 /tmp
# 使用保护模式
tmpwatch --protect 'important_*' 24 /tmp
| 特性 | tmpwatch | tmpreaper |
|---|---|---|
| 主要发行版 | RHEL/CentOS/Fedora | Debian/Ubuntu |
| 配置文件 | /etc/cron.daily/tmpwatch |
/etc/tmpreaper.conf |
| 语法 | tmpwatch 时间 目录 |
tmpreaper 时间 目录 |
| 功能 | 基本相同 | 基本相同 |
# 安装tmpreaper
sudo apt-get install tmpreaper
# 基本使用(与tmpwatch相同)
tmpreaper 24h /tmp
# 显示将被删除的文件
tmpreaper --test 7d /var/tmp
# 保护特定文件
tmpreaper --protect '*.sock' 24h /tmp
# /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_*' 10d /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
# /etc/tmpreaper.conf
# 要清理的目录
TMPREAPER_DIRS='/tmp /var/tmp'
# 清理时间
TMPREAPER_TIME='7d'
# 保护的文件模式
TMPREAPER_PROTECT_EXTRA='*.socket *.pid'
# 详细输出
TMPREAPER_VERBOSE=true
| 问题 | 原因 | 解决方案 |
|---|---|---|
| "command not found" | tmpwatch未安装 | 安装tmpwatch或tmpreaper包 |
| 权限被拒绝 | 没有目录访问权限 | 使用sudo或以root用户运行 |
| 删除了重要文件 | 排除规则不完善 | 使用测试模式预览,完善排除规则 |
| 服务异常终止 | 配置错误或权限问题 | 检查系统日志和配置文件 |
| 清理不彻底 | 时间设置过短或文件正在使用 | 调整时间参数,使用-s选项 |
# 查看tmpwatch执行日志
sudo grep tmpwatch /var/log/cron
sudo grep tmpwatch /var/log/syslog
# 手动运行并记录日志
tmpwatch -v 24 /tmp | tee -a /var/log/tmpwatch.log
# 监控磁盘空间变化
df -h /tmp
tmpwatch 24 /tmp
df -h /tmp