使用方法:
bash
# 1. 保存脚本并添加执行权限
chmod +x cleanup_logs.sh
# 2. 使用默认路径运行
./cleanup_logs.sh
# 3. 或指定自定义路径
./cleanup_logs.sh /your/custom/log/path
如果需要自动执行(无需确认): 注释掉第83-89行的确认部分,或者添加一个 -f 参数选项。
#!/bin/bash
###############################################################################
# DB2 日志清理脚本
# 功能: 保留最新的100个日志文件,删除更早的日志
# 使用方法: ./cleanup_logs.sh [日志目录路径]
###############################################################################
# 设置日志目录(如果没有传入参数,使用默认路径)
LOG_DIR="${1:-/data/db2inst1/isinarc/db2inst1/ISIMDB/NODE0000/LOGSTREAM0000/C0000012}"
# 保留的日志文件数量
KEEP_COUNT=100
# 日志文件模式(根据您的截图,文件名格式为 S*.LOG)
LOG_PATTERN="S*.LOG"
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
###############################################################################
# 函数: 打印带颜色的消息
###############################################################################
print_info() {
echo -e "${GREEN}[INFO]${NC} $1"
}
print_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
print_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
###############################################################################
# 主程序
###############################################################################
# 检查目录是否存在
if [ ! -d "$LOG_DIR" ]; then
print_error "目录不存在: $LOG_DIR"
exit 1
fi
# 进入日志目录
cd "$LOG_DIR" || {
print_error "无法进入目录: $LOG_DIR"
exit 1
}
print_info "当前工作目录: $(pwd)"
print_info "日志文件模式: $LOG_PATTERN"
print_info "保留文件数量: $KEEP_COUNT"
# 统计当前日志文件总数
TOTAL_COUNT=$(ls -1 $LOG_PATTERN 2>/dev/null | wc -l)
if [ "$TOTAL_COUNT" -eq 0 ]; then
print_warn "未找到匹配的日志文件"
exit 0
fi
print_info "当前日志文件总数: $TOTAL_COUNT"
# 如果文件总数小于等于保留数量,不需要删除
if [ "$TOTAL_COUNT" -le "$KEEP_COUNT" ]; then
print_info "文件数量未超过保留数量,无需清理"
exit 0
fi
# 计算需要删除的文件数量
DELETE_COUNT=$((TOTAL_COUNT - KEEP_COUNT))
print_warn "需要删除 $DELETE_COUNT 个旧日志文件"
# 备份即将删除的文件列表
BACKUP_LIST="/tmp/db2_deleted_logs_$(date +%Y%m%d_%H%M%S).txt"
# 列出最旧的文件(按时间排序,保留最新的100个,删除其余)
# 使用 ls -t 按修改时间排序(最新的在前),然后用 tail 获取最旧的文件
print_info "生成删除列表..."
ls -t $LOG_PATTERN | tail -n $DELETE_COUNT > "$BACKUP_LIST"
# 显示即将删除的文件(仅显示前10个和后10个)
print_warn "即将删除的文件示例(前5个):"
head -n 5 "$BACKUP_LIST" | while read -r file; do
echo " - $file ($(stat -c %y "$file" 2>/dev/null || stat -f "%Sm" "$file"))"
done
# 确认删除(可选,如果需要自动执行,注释掉以下部分)
echo ""
read -p "确认删除以上文件? (yes/no): " CONFIRM
if [ "$CONFIRM" != "yes" ]; then
print_info "取消删除操作"
print_info "删除列表已保存到: $BACKUP_LIST"
exit 0
fi
# 执行删除
print_info "开始删除旧日志文件..."
DELETED=0
FAILED=0
while IFS= read -r file; do
if [ -f "$file" ]; then
if rm -f "$file"; then
((DELETED++))
else
print_error "删除失败: $file"
((FAILED++))
fi
fi
done < "$BACKUP_LIST"
# 显示结果
echo ""
print_info "========== 清理完成 =========="
print_info "成功删除: $DELETED 个文件"
if [ "$FAILED" -gt 0 ]; then
print_error "删除失败: $FAILED 个文件"
fi
# 显示剩余文件数
REMAINING_COUNT=$(ls -1 $LOG_PATTERN 2>/dev/null | wc -l)
print_info "剩余文件数: $REMAINING_COUNT"
print_info "删除列表备份: $BACKUP_LIST"
exit 0
功能特性:
✅ 保留最新的100个日志文件
✅ 按修改时间排序,删除最旧的文件
✅ 删除前需要确认(防止误删)
✅ 备份删除文件列表到 /tmp
✅ 彩色输出,清晰显示操作状态
✅ 完整的错误处理
查看最新的 cron 执行记录:
tail -f /var/log/syslog | grep CRON
# 或
tail -f /var/log/cron
