```
feat(common): 添加GlowFilter的Level字段 添加了GlowFilter结构体中的Level字段,用于表示等级信息, 对应JSON标签为"level,omitempty" --- fix(utils): 修复concurrent_swiss_map中的panic处理 - 使用goroutine替代线程池来监听通道 - 添加panic恢复机制,当发生panic时记录错误日志 - 确保在异常情况下程序能够
This commit is contained in:
@@ -197,93 +197,11 @@ else
|
||||
command -v screen || { echo "❌ Screen安装失败"; exit 1; }
|
||||
fi
|
||||
|
||||
|
||||
#!/bin/bash
|
||||
# 核心:无任何可能阻塞的命令,全程实时输出,100%不卡住 + 彻底清理所有logic会话
|
||||
set -euo pipefail
|
||||
|
||||
# ===== 仅需配置这1个变量 =====
|
||||
SCREEN_NAME="logic"
|
||||
|
||||
# ===== 颜色输出函数(确保能看到输出)=====
|
||||
red() { echo -e "\033[31m[$(date +%H:%M:%S)] $1\033[0m"; }
|
||||
green() { echo -e "\033[32m[$(date +%H:%M:%S)] $1\033[0m"; }
|
||||
yellow() { echo -e "\033[33m[$(date +%H:%M:%S)] $1\033[0m"; }
|
||||
|
||||
# ===== 新增:彻底清理screen会话(核心修复)=====
|
||||
clean_screen_sessions() {
|
||||
local sess_id=$1
|
||||
# 1. 先优雅关闭screen会话
|
||||
screen -S "${sess_id}" -X quit >/dev/null 2>&1 || true
|
||||
sleep 0.3
|
||||
# 2. 提取会话PID并强制杀死
|
||||
local sess_pid=$(echo "${sess_id}" | cut -d. -f1)
|
||||
if [ -n "${sess_pid}" ]; then
|
||||
kill -9 "${sess_pid}" >/dev/null 2>&1 || true
|
||||
# 3. 杀死该PID的所有子进程
|
||||
pkill -9 -P "${sess_pid}" >/dev/null 2>&1 || true
|
||||
fi
|
||||
}
|
||||
|
||||
# ===== 强制关闭所有阻塞的后台进程(先清场)=====
|
||||
green "【步骤1/5】清理脚本自身可能的阻塞进程"
|
||||
pkill -f "screen_clean_*" >/dev/null 2>&1 || true
|
||||
pkill -9 -f "pgrep -f SCREEN -S ${SCREEN_NAME}" >/dev/null 2>&1 || true
|
||||
|
||||
# ===== 非阻塞查找进程+会话(关键:延长超时到1秒,查更全)=====
|
||||
green "【步骤2/5】查找${SCREEN_NAME}相关进程/会话(非阻塞)"
|
||||
# 先查screen会话ID(1秒超时,避免漏查)
|
||||
SCREEN_SESS=$(timeout 1 screen -ls 2>/dev/null | grep -E "[0-9]+\\.${SCREEN_NAME}" | grep -v "Dead" | awk '{print $1}' || true)
|
||||
# 再查进程PID
|
||||
SCREEN_PIDS=$(timeout 1 pgrep -f "SCREEN -S ${SCREEN_NAME}" | grep -v $$ || true)
|
||||
|
||||
# 合并需要清理的目标
|
||||
if [ -z "${SCREEN_SESS}" ] && [ -z "${SCREEN_PIDS}" ]; then
|
||||
green "✅ 未找到${SCREEN_NAME}相关进程/会话,无需清理"
|
||||
else
|
||||
yellow "⚠️ 找到${SCREEN_NAME}会话:${SCREEN_SESS:-无}"
|
||||
yellow "⚠️ 找到${SCREEN_NAME}进程:${SCREEN_PIDS:-无}"
|
||||
|
||||
# ===== 非阻塞强制清理(先清会话,再清进程)=====
|
||||
green "【步骤3/5】强制清理${SCREEN_NAME}进程及会话"
|
||||
# 1. 清理所有screen会话
|
||||
if [ -n "${SCREEN_SESS}" ]; then
|
||||
for sess in ${SCREEN_SESS}; do
|
||||
yellow "🔧 清理会话:${sess}"
|
||||
clean_screen_sessions "${sess}"
|
||||
done
|
||||
fi
|
||||
# 2. 清理剩余进程(兜底)
|
||||
if [ -n "${SCREEN_PIDS}" ]; then
|
||||
for pid in ${SCREEN_PIDS}; do
|
||||
yellow "🔧 清理进程:${pid}"
|
||||
kill -9 "${pid}" >/dev/null 2>&1 || true
|
||||
pkill -9 -P "${pid}" >/dev/null 2>&1 || true
|
||||
done
|
||||
fi
|
||||
|
||||
# 短暂等待(0.5秒,非阻塞)
|
||||
sleep 0.5
|
||||
|
||||
# ===== 验证清理结果(查会话+进程,双重验证)=====
|
||||
green "【步骤4/5】验证清理结果(会话+进程双重检查)"
|
||||
FINAL_SESS=$(timeout 1 screen -ls 2>/dev/null | grep -E "[0-9]+\\.${SCREEN_NAME}" | grep -v "Dead" || true)
|
||||
FINAL_PIDS=$(timeout 1 pgrep -f "SCREEN -S ${SCREEN_NAME}" | grep -v $$ || true)
|
||||
|
||||
if [ -z "${FINAL_SESS}" ] && [ -z "${FINAL_PIDS}" ]; then
|
||||
green "✅ ${SCREEN_NAME}进程/会话已全部清理完成"
|
||||
else
|
||||
red "❌ 仍有残留:会话[${FINAL_SESS}] 进程[${FINAL_PIDS}],再次强制清理"
|
||||
# 终极兜底:强制杀死所有相关进程
|
||||
pkill -9 -f "${SCREEN_NAME}" >/dev/null 2>&1 || true
|
||||
fi
|
||||
fi
|
||||
|
||||
# ===== 最终收尾 =====
|
||||
green "【步骤5/5】${SCREEN_NAME}会话清理流程结束"
|
||||
green "✅ 自动化部署后续流程可正常执行"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# ===== 准备下载目录 =====
|
||||
@@ -311,10 +229,8 @@ echo "下载链接:%s{file_url}"
|
||||
echo "目标路径:%s{exe_path}"
|
||||
|
||||
# 删除旧文件(关键修复:这里要判断目标路径,不是下载链接)
|
||||
if [ -f "%s{exe_path}" ]; then
|
||||
echo "删除旧文件:%s{exe_path}"
|
||||
rm -f "%s{exe_path}"
|
||||
fi
|
||||
echo "删除旧文件:%s{exe_path}"
|
||||
rm -f "%s{exe_path}"
|
||||
|
||||
echo "开始下载..."
|
||||
DOWNLOAD_SUCCESS=0
|
||||
|
||||
Reference in New Issue
Block a user