Linux tmpwatch命令 详解

tmpwatch命令 是一个自动清理临时文件和目录的系统工具,通过删除指定时间内未被访问的文件来帮助管理系统磁盘空间。
注意:

在一些现代Linux发行版中,tmpwatch已被tmpreaper取代。两个工具功能类似,但tmpreaper在某些系统上更常见。

命令简介

tmpwatch(temporary watch的缩写)命令主要用于:

  • 自动清理临时文件和目录
  • 管理系统磁盘空间
  • 防止临时文件堆积
  • 基于文件访问时间进行清理

安装tmpwatch

# 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(周)

使用示例

1. 基本清理操作

清理24小时内未被访问的文件:

tmpwatch 24 /tmp

2. 测试模式

使用 -t 选项预览将要删除的文件:

tmpwatch -t 48 /var/tmp

3. 详细模式

使用 -v 选项显示删除的文件:

tmpwatch -v 168 /tmp

4. 基于修改时间清理

使用 -m 选项基于文件修改时间:

tmpwatch -m 30d /cache

5. 排除特定文件

使用 -x 选项排除特定文件或目录:

tmpwatch -x '.important' 24 /tmp

6. 保护特定用户文件

使用 -U 选项保护特定用户的文件:

tmpwatch -U root 24 /tmp

7. 检查文件使用情况

使用 -s 选项避免删除正在使用的文件:

tmpwatch -s 24 /tmp

8. 清理多个目录

同时清理多个目录:

tmpwatch 72 /tmp /var/tmp /cache

实际应用场景

1. 系统临时目录维护

定期清理系统临时目录:

# 清理24小时未访问的/tmp文件
tmpwatch 24 /tmp

# 清理7天未访问的/var/tmp文件
tmpwatch 7d /var/tmp

2. Web服务器缓存清理

清理Web服务器缓存文件:

# 清理30天前的缓存文件
tmpwatch -m 30d /var/cache/nginx
tmpwatch -m 30d /var/cache/apache2

3. 应用程序日志轮转

清理旧的应用程序日志:

# 清理90天前的日志文件
tmpwatch -m 90d /var/log/myapp

4. 用户家目录清理

清理用户缓存和临时文件:

# 清理用户缓存目录
tmpwatch 30d /home/*/.cache
tmpwatch 30d /home/*/.tmp

系统集成

1. 配置系统定时任务

设置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

2. 系统服务配置

在一些系统中,tmpwatch作为系统服务运行:

# 检查tmpwatch服务状态
systemctl status tmpwatch

# 查看服务配置
cat /etc/cron.daily/tmpwatch
cat /etc/tmpwatch.d/

安全注意事项

重要安全提示:
  • 在使用tmpwatch前总是先用 -t 选项测试
  • 避免在生产环境高峰时段运行tmpwatch
  • 确保排除正在使用的关键文件
  • 考虑使用 -s 选项避免删除正在使用的文件
  • 定期检查tmpwatch日志确保正常运行

高级用法

1. 自定义清理脚本

创建高级清理脚本:

#!/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"

2. 守护进程模式

使用 -l 选项在后台持续运行:

# 在后台持续监控和清理
tmpwatch -l -v 24 /tmp

# 查看后台进程
ps aux | grep tmpwatch

3. 排除模式配置

使用复杂的排除规则:

# 排除多个模式
tmpwatch -X '*.pid' -X '*.sock' -X '.X11*' 24 /tmp

# 使用保护模式
tmpwatch --protect 'important_*' 24 /tmp

与tmpreaper的对比

特性 tmpwatch tmpreaper
主要发行版 RHEL/CentOS/Fedora Debian/Ubuntu
配置文件 /etc/cron.daily/tmpwatch /etc/tmpreaper.conf
语法 tmpwatch 时间 目录 tmpreaper 时间 目录
功能 基本相同 基本相同

tmpreaper使用示例

# 安装tmpreaper
sudo apt-get install tmpreaper

# 基本使用(与tmpwatch相同)
tmpreaper 24h /tmp

# 显示将被删除的文件
tmpreaper --test 7d /var/tmp

# 保护特定文件
tmpreaper --protect '*.sock' 24h /tmp

配置文件示例

1. tmpwatch配置文件

# /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

2. tmpreaper配置文件

# /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

注意事项

  • 在生产环境中使用前务必进行充分测试
  • 避免删除正在被应用程序使用的文件
  • 定期检查排除规则,确保重要文件受到保护
  • 考虑使用更保守的时间设置,避免过度清理
  • 监控清理操作的磁盘空间回收效果
  • 在虚拟化环境中注意共享存储的清理影响

相关命令

  • tmpreaper - tmpwatch的替代工具
  • find - 查找文件,可用于手动清理
  • cron - 定时任务调度器
  • logrotate - 日志文件轮转工具
  • systemctl - 系统服务管理
  • df - 磁盘空间检查
  • du - 目录空间使用情况