提交 f3f26dc1 authored 作者: PGY's avatar PGY

feat(auto-clean-script): 升级自动化清理脚本至V3.2版本

- 将脚本版本从V3.1升级至V3.2,更新日期改为2026-07-31
- 添加日志目录创建逻辑,确保日志目录存在
- 将固定容器名称改为模糊匹配模式,支持匹配ujava2、ujava3等多个容器
- 新增find_java_container函数实现容器名称动态查找
- 修复日志轮转中的路径错误,统一使用LOG_FILE目录
- 优化进程处理逻辑,在杀死进程前先获取工作目录
- 改进特定应用检测逻辑,提高准确性
上级 a624d59d
...@@ -3,9 +3,9 @@ ...@@ -3,9 +3,9 @@
#=============================================================================== #===============================================================================
# 脚本名称:auto_clean_deleted_ubains_v3.sh # 脚本名称:auto_clean_deleted_ubains_v3.sh
# 功能描述:已删除大文件自动清理与容器重启脚本 # 功能描述:已删除大文件自动清理与容器重启脚本
# 版本:V3.1 # 版本:V3.2
# 创建日期:2026-01-27 # 创建日期:2026-01-27
# 更新日期:2026-03-30 # 更新日期:2026-07-31
# #
# 监测对象: # 监测对象:
# 1. 进程占用的已删除大文件(>1GB) # 1. 进程占用的已删除大文件(>1GB)
...@@ -32,18 +32,44 @@ ...@@ -32,18 +32,44 @@
TARGET_KEY="ubains-INFO-AND-ERROR" TARGET_KEY="ubains-INFO-AND-ERROR"
MIN_SIZE=$((1024*1024*1024)) # 1GB (单位:字节) MIN_SIZE=$((1024*1024*1024)) # 1GB (单位:字节)
LOG_FILE="/data/logs/auto_clean_deleted_ubains.log" LOG_FILE="/data/logs/auto_clean_deleted_ubains.log"
# 确保日志目录存在
mkdir -p "$(dirname "$LOG_FILE")" 2>/dev/null
MAX_LOG_SIZE=$((5*1024*1024)) # 5MB 日志大小限制 MAX_LOG_SIZE=$((5*1024*1024)) # 5MB 日志大小限制
LOG_RETENTION_DAYS=7 # 日志保留天数 LOG_RETENTION_DAYS=7 # 日志保留天数
CONTAINER_NAME="ujava2" # 容器名称 CONTAINER_PATTERN="ujava" # 容器模糊匹配模式(匹配ujava2、ujava3等)
APP_PATH="/data/services/api/java-meeting/java-meeting-extapi" # 特定应用路径 APP_PATH="/data/services/api/java-meeting/java-meeting-extapi" # 特定应用路径
APP_START_SCRIPT="${APP_PATH}/run.sh" # 特定应用启动脚本 APP_START_SCRIPT="${APP_PATH}/run.sh" # 特定应用启动脚本
# =========================================== # ===========================================
# 日志函数 # 日志函数(必须在 find_java_container 之前定义)
log() { log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE" echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE"
} }
# ========== 容器模糊匹配函数 ==========
# 功能:查找名称包含指定模式的运行中容器
# 返回:容器名称(通过stdout),未找到返回空
find_java_container() {
local pattern="$1"
local container_name=$(docker ps --format "{{.Names}}" | grep -F "$pattern" | head -n 1)
if [ -z "$container_name" ]; then
log "[ERROR] 未找到匹配 '$pattern' 的运行中容器"
return 1
fi
log "[INFO] 找到Java容器: $container_name"
echo "$container_name"
return 0
}
# 获取Java容器名称(全局变量)
CONTAINER_NAME=$(find_java_container "$CONTAINER_PATTERN")
if [ -z "$CONTAINER_NAME" ]; then
log "[ERROR] 未找到Java容器,脚本退出"
exit 1
fi
# 日志轮转 # 日志轮转
rotate_logs() { rotate_logs() {
if [ -f "$LOG_FILE" ]; then if [ -f "$LOG_FILE" ]; then
...@@ -54,7 +80,7 @@ rotate_logs() { ...@@ -54,7 +80,7 @@ rotate_logs() {
log "日志文件超过 5MB,已自动轮转。" log "日志文件超过 5MB,已自动轮转。"
fi fi
fi fi
find "$(dirname "$0")" -name "auto_clean_deleted_ubains.log.*" -mtime +$LOG_RETENTION_DAYS -exec rm -f {} \; find "$(dirname "$LOG_FILE")" -name "auto_clean_deleted_ubains.log.*" -mtime +$LOG_RETENTION_DAYS -exec rm -f {} \;
} }
rotate_logs rotate_logs
...@@ -99,13 +125,16 @@ for fd_path in /proc/[0-9]*/fd/*; do ...@@ -99,13 +125,16 @@ for fd_path in /proc/[0-9]*/fd/*; do
if [ "$size_bytes" -ge "$MIN_SIZE" ]; then if [ "$size_bytes" -ge "$MIN_SIZE" ]; then
log "⚠ 文件超过1GB,执行自动处理。" log "⚠ 文件超过1GB,执行自动处理。"
# 先读取进程工作目录,再杀死进程(避免PID回收导致误判)
proc_cwd=$(readlink /proc/$pid/cwd 2>/dev/null)
log "➡ 杀死进程 PID: $pid" log "➡ 杀死进程 PID: $pid"
kill -9 "$pid" 2>/dev/null kill -9 "$pid" 2>/dev/null
sleep 1 sleep 1
NEED_RESTART=1 NEED_RESTART=1
# 获取进程的当前工作目录,判断是否为特定应用 # 判断被杀死的进程是否属于特定应用
proc_cwd=$(readlink /proc/$pid/cwd 2>/dev/null)
if [ "$proc_cwd" == "$APP_PATH" ]; then if [ "$proc_cwd" == "$APP_PATH" ]; then
log "检测到被杀死的进程属于特定应用:$APP_PATH,将在容器重启后尝试启动。" log "检测到被杀死的进程属于特定应用:$APP_PATH,将在容器重启后尝试启动。"
NEED_APP_START=1 NEED_APP_START=1
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论