温馨提示×

Linux用户必学:如何利用定时任务自动清理系统

小樊
59
2026-01-03 18:40:12
栏目: 智能运维

Linux定时任务自动清理系统

一 核心工具与基础语法

  • 使用cron进行周期性清理,配合find精准匹配并删除过期文件,必要时用logrotate管理日志轮转,用systemd确保清理脚本作为服务运行。
  • crontab时间字段:分 时 日 月 周 命令;特殊字符:*(任意)、,(枚举)、-(范围)、/(步长)。常用命令:crontab -e(编辑)、crontab -l(查看)、crontab -r(删除)。示例:0 2 * * * /usr/local/bin/backup.sh(每天2:00执行)。
  • 系统级临时目录清理通常由tmpwatch/tmpreaper通过**/etc/cron.daily/tmpwatch定时执行(如:/usr/sbin/tmpwatch 30d /var/tmp**),无需重复造轮子。

二 通用清理脚本模板

  • 目标:按保留天数删除文件、可选删除空目录、记录操作日志、避免误删、兼容含空格文件名。
  • 建议将脚本放到**/usr/local/bin/cleanup.sh**,权限700,由root按计划执行。
#!/usr/bin/env bash
set -Eeuo pipefail

# 配置区
LOG_FILE="/var/log/cleanup.log"
KEEP_DAYS=30
TARGETS=(
  "/var/log/myapp/*.log"
  "/opt/data/cache"
)
DELETE_EMPTY_DIRS=false   # 设为 true 时删除空目录

# 初始化日志
exec >>"$LOG_FILE" 2>&1
echo "=== Cleanup started at $(date '+%F %T %Z') ==="

# 安全删除:先打印,再删除;兼容空格与特殊字符
safe_find_rm() {
  local dir="$1"
  local pattern="${2:-*}"
  find "$dir" -mindepth 1 \( -type f -mtime "+${KEEP_DAYS}" -o -type d -empty \) \
    \( -name "$pattern" -o -name "*.gz" -o -name "*.bz2" \) -print0 | \
    while IFS= read -r -d '' file; do
      echo "DELETING: $file"
      rm -rf -- "$file"
    done
}

# 主流程
for target in "${TARGETS[@]}"; do
  if [[ -e "$target" ]]; then
    if [[ -d "$target" ]]; then
      safe_find_rm "$target"
      if $DELETE_EMPTY_DIRS; then
        find "$target" -mindepth 1 -type d -empty -print0 | \
          while IFS= read -r -d '' d; do
            echo "RMDIR: $d"
            rmdir -- "$d"
          done
      fi
    else
      safe_find_rm "$(dirname "$target")" "$(basename "$target")"
    fi
  else
    echo "SKIP (not exist): $target"
  fi
done

echo "=== Cleanup finished at $(date '+%F %T %Z') ==="
  • 赋权与首次验证:
    • chmod 700 /usr/local/bin/cleanup.sh
    • 先手动执行:/usr/local/bin/cleanup.sh(确认日志与删除范围正确)。

三 配置定时任务与日志轮转

  • 添加计划任务(root执行):crontab -e
    • 每天02:00执行并写日志:
      • 0 2 * * * /usr/local/bin/cleanup.sh
    • 如需静默运行(不推荐无日志):
      • 0 2 * * * /usr/local/bin/cleanup.sh >/dev/null 2>&1
  • 日志轮转(/etc/logrotate.d/cleanup):
    • /var/log/cleanup.log {
      • daily
      • rotate 7
      • compress
      • missingok
      • notifempty }
  • 服务日志的专业做法:对系统/服务日志优先使用logrotate配置轮转与保留策略,而非粗暴删除;清理脚本仅处理自定义目录或应用日志。

四 常见清理场景与命令

  • 包管理器缓存
    • Debian/Ubuntu:apt-get clean && apt-get autoclean
    • RHEL/CentOS:yum clean all
    • Fedora:dnf clean all
  • systemd 日志
    • 保留最近3天:journalctl --vacuum-time=3d
  • 临时文件
    • 谨慎清理**/tmp**:优先依赖系统的tmpwatch/tmpreaper机制;若需自定义,务必排除**/tmp/.X11-unix**等会话目录与关键 socket。
  • 大文件排查(辅助策略)
    • 查找大于100MB的文件:find / -type f -size +100M 2>/dev/null
    • 查看目录占用排行:du -sh * | sort -rh | head -n 10
  • 注意:清理**/tmpjournal**可能影响正在运行的程序与系统诊断,建议先在测试环境验证。

五 安全与排错要点

  • 权限最小化:清理脚本700,仅root可写/执行;crontab以最小权限用户运行。
  • 使用绝对路径(which find、which rm、脚本路径等),避免cron环境变量差异导致命令找不到。
  • 先“干跑”验证:把删除改为打印(echo)或将-exec rm改为-exec echo,确认匹配集合无误再真正删除。
  • 处理含空格/特殊字符文件名:优先使用find … -print0 | xargs -0或while read -d ‘’。
  • 日志与审计:脚本输出必须落盘;配合logrotate控制日志体积;必要时将关键操作通过邮件或企业IM告警。
  • 服务兼容性:被清理的日志若被进程占用,删除后需让进程重新打开日志文件(如 systemd 服务发送SIGHUP或重启服务),否则可能出现写入失败或继续占用旧inode。
  • 运行与排查:确认crond/cron服务运行;查看系统日志(如**/var/log/cronjournalctl -u cron**)核对任务是否执行及报错。

0