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
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
- 注意:清理**/tmp与journal**可能影响正在运行的程序与系统诊断,建议先在测试环境验证。
五 安全与排错要点
- 权限最小化:清理脚本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/cron或journalctl -u cron**)核对任务是否执行及报错。