Files
Work-configuration-file/jenkins/流水线配置/go_中转服务/wait_for_connections.sh

265 lines
8.6 KiB
Bash
Raw Normal View History

2025-10-13 11:05:51 +08:00
#!/bin/bash
# 等待指定端口的连接数连续3次为0每次间隔5秒
# 使用方法: wait_s1_for_connections.sh <port> <timeout>
# 示例: wait_s1_for_connections.sh 8000 300最多等待300秒
PORT=$1
TIMEOUT=$2
START_TIME=$(date +%s)
END_TIME=$((START_TIME + TIMEOUT))
SUCCESS_COUNT=0 # 连续成功计数
REQUIRED_SUCCESS=3 # 需要连续成功的次数
CHECK_INTERVAL=5 # 每次检测间隔(秒)
if [ -z "$PORT" ]; then
echo "用法: $0 <port> <timeout>"
exit 1
fi
if [ -z "$TIMEOUT" ]; then
TIMEOUT=600 # 默认超时时间600秒
fi
echo "等待端口 $PORT 的连接数连续 $REQUIRED_SUCCESS 次为0每次检测间隔 $CHECK_INTERVAL 秒),超时时间 $TIMEOUT"
while [ $(date +%s) -lt $END_TIME ]; do
# 检测当前连接数
CONNECTIONS=$(netstat -anp | grep :$PORT | grep ESTABLISHED | wc -l)
echo "当前连接数: $CONNECTIONS(检测次数: $SUCCESS_COUNT/$REQUIRED_SUCCESS"
if [ "$CONNECTIONS" -eq 0 ]; then
SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
echo "检测到连接数为0连续成功计数: $SUCCESS_COUNT/$REQUIRED_SUCCESS"
# 达到3次连续成功退出
if [ "$SUCCESS_COUNT" -eq "$REQUIRED_SUCCESS" ]; then
echo "已连续 $REQUIRED_SUCCESS 次(每次间隔 $CHECK_INTERVAL 秒)检测到端口 $PORT 无活跃连接"
exit 0
fi
else
# 连接数不为0重置计数器
SUCCESS_COUNT=0
echo "连接数不为0重置连续成功计数"
fi
# 每次检测后间隔5秒
echo "等待 $CHECK_INTERVAL 秒后进行下一次检测..."
echo "======================"
sleep $CHECK_INTERVAL
done
echo "超时! 端口 $PORT$TIMEOUT 秒内未达到连续 $REQUIRED_SUCCESS 次连接数为0当前连接数: $CONNECTIONS"
exit 1
# === 8月11日 === ↓ ===增加了连接类型过滤和进程实际请求检测======= ↓ =======================================
#!/bin/bash
# 等待AI进程的活跃用户连接为0排除内部连接和无效连接
# 使用方法: wait_for_ai_connections.sh <port> <process_name> <timeout>
# 示例: wait_for_ai_connections.sh 8000 "python server.py" 300
# netstat -anp | grep :8000 | grep ESTABLISHED | wc -l
PORT=$1
PROCESS_NAME=$2 # 进程特征名称,用于精准定位
TIMEOUT=${3:-300} # 默认超时时间300秒
# 参数校验
if [ -z "$PORT" ] || [ -z "$PROCESS_NAME" ]; then
echo "用法: $0 <port> <process_name> <timeout>"
echo "示例: $0 8000 'python server.py' 300"
exit 1
fi
# 配置参数
START_TIME=$(date +%s)
END_TIME=$((START_TIME + TIMEOUT))
SUCCESS_COUNT=0
REQUIRED_SUCCESS=3 # 连续3次检测通过
CHECK_INTERVAL=5 # 检测间隔(秒)
NGINX_IP=$(hostname -I | awk '{print $1}') # Nginx服务器IP排除自身连接
echo "开始检测端口 $PORT 上的进程 '$PROCESS_NAME',超时时间 $TIMEOUT"
echo "将排除与Nginx服务器($NGINX_IP)的内部连接"
# 获取进程ID用于更精准的连接检测
PID=$(ps aux | grep -v grep | grep "$PROCESS_NAME" | grep ":$PORT" | awk '{print $2}')
if [ -z "$PID" ]; then
echo "未找到端口 $PORT 上的进程 '$PROCESS_NAME'"
exit 1
fi
echo "检测到目标进程PID: $PID"
while [ $(date +%s) -lt $END_TIME ]; do
# 1. 检测活跃连接排除Nginx内部连接和TIME_WAIT状态
# 过滤条件:
# - 状态为ESTABLISHED
# - 不包含Nginx服务器IP排除负载均衡器的健康检查连接
# - 属于目标进程PID
CONNECTIONS=$(netstat -antp | grep -E ":$PORT.*ESTABLISHED" | grep -v "$NGINX_IP" | grep "$PID" | wc -l)
# 2. 检测进程是否有近期请求日志(如果日志有时间戳)
# 检查最近30秒内是否有新请求
RECENT_LOGS=0
LOG_FILE=$(find /data/webapps/ -name "lessie_sourcing_agents_*.log" | sort -r | head -1)
if [ -n "$LOG_FILE" ]; then
RECENT_LOGS=$(tail -n 100 "$LOG_FILE" | grep -E "$(date -d '30 seconds ago' +'%Y-%m-%d %H:%M:%S')" -A 100 | grep -i "request" | wc -l)
fi
echo "=== 检测结果 ==="
echo "活跃用户连接数: $CONNECTIONS排除Nginx内部连接"
echo "最近30秒请求数: $RECENT_LOGS"
echo "连续无连接计数: $SUCCESS_COUNT/$REQUIRED_SUCCESS"
echo "================="
# 判断条件:无活跃连接且无近期请求
if [ "$CONNECTIONS" -eq 0 ] && [ "$RECENT_LOGS" -eq 0 ]; then
SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
if [ "$SUCCESS_COUNT" -eq "$REQUIRED_SUCCESS" ]; then
echo "已确认进程无活跃用户连接,安全下线"
exit 0
fi
else
SUCCESS_COUNT=0
fi
sleep $CHECK_INTERVAL
done
echo "超时! 进程仍有活动(连接数: $CONNECTIONS,近期请求: $RECENT_LOGS"
exit 1
# -------------------------
#!/bin/bash
# 等待指定端口的连接数连续3次为0每次间隔5秒
# 使用方法: wait_s1_for_connections.sh <port> <timeout>
# 示例: wait_s1_for_connections.sh 8000 300最多等待300秒
PORT=$1
TIMEOUT=$2
START_TIME=$(date +%s)
END_TIME=$((START_TIME + TIMEOUT))
SUCCESS_COUNT=0 # 连续成功计数
REQUIRED_SUCCESS=5 # 需要连续成功的次数
CHECK_INTERVAL=5 # 每次检测间隔(秒)
if [ -z "$PORT" ]; then
echo "用法: $0 <port> <timeout>"
exit 1
fi
if [ -z "$TIMEOUT" ]; then
TIMEOUT=600 # 默认超时时间600秒
fi
echo "等待端口 $PORT 的连接数连续 $REQUIRED_SUCCESS 次为0每次检测间隔 $CHECK_INTERVAL 秒),超时时间 $TIMEOUT"
while [ $(date +%s) -lt $END_TIME ]; do
# 检测当前连接数
CONNECTIONS=$(netstat -anp | grep :$PORT | grep -w ESTABLISHED | wc -l)
echo "当前连接数: $CONNECTIONS(检测次数: $SUCCESS_COUNT/$REQUIRED_SUCCESS"
if [ "$CONNECTIONS" -eq 0 ]; then
SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
echo "检测到连接数为0连续成功计数: $SUCCESS_COUNT/$REQUIRED_SUCCESS"
# 达到3次连续成功退出
if [ "$SUCCESS_COUNT" -eq "$REQUIRED_SUCCESS" ]; then
echo "已连续 $REQUIRED_SUCCESS 次(每次间隔 $CHECK_INTERVAL 秒)检测到端口 $PORT 无活跃连接"
exit 0
fi
else
# 连接数不为0重置计数器
SUCCESS_COUNT=0
echo "连接数不为0重置连续成功计数"
fi
# 每次检测后间隔5秒
echo "等待 $CHECK_INTERVAL 秒后进行下一次检测..."
echo " "
sleep $CHECK_INTERVAL
done
echo "超时! 端口 $PORT$TIMEOUT 秒内未达到连续 $REQUIRED_SUCCESS 次连接数为0当前连接数: $CONNECTIONS"
exit 1
---------------------------------------------
#!/bin/bash
#
# 等待指定端口的连接数连续 N 次为 0每次间隔 M 秒)
# 用法: wait_for_connections.sh <port> [timeout]
# 示例: wait_for_connections.sh 8000 300 # 最多等待 300 秒
#
PORT=$1
TIMEOUT=${2:-600} # 默认超时 600 秒
REQUIRED_SUCCESS=${REQUIRED_SUCCESS:-5} # 需要连续成功次数,默认 5 次
CHECK_INTERVAL=${CHECK_INTERVAL:-5} # 检测间隔,默认 5 秒
START_TIME=$(date +%s)
END_TIME=$((START_TIME + TIMEOUT))
SUCCESS_COUNT=0
if [ -z "$PORT" ]; then
echo "用法: $0 <port> [timeout]"
exit 1
fi
# 检测可用工具
if command -v ss >/dev/null 2>&1; then
NET_TOOL="ss"
elif command -v netstat >/dev/null 2>&1; then
NET_TOOL="netstat"
else
echo "错误: 没有找到 ss 或 netstat 命令"
exit 1
fi
# 获取当前端口 ESTABLISHED 连接数
get_connections() {
if [ "$NET_TOOL" = "ss" ]; then
ss -tanp 2>/dev/null | grep ":$PORT" | grep ESTAB | wc -l
else
netstat -anp 2>/dev/null | grep ":$PORT" | grep -w ESTABLISHED | wc -l
fi
}
echo "开始检测: 端口 $PORT"
echo "条件: 连续 $REQUIRED_SUCCESS 次为 0检测间隔 ${CHECK_INTERVAL}s超时时间 ${TIMEOUT}s"
echo "使用工具: $NET_TOOL"
echo "---------------------------------------------"
while [ $(date +%s) -lt $END_TIME ]; do
CONNECTIONS=$(get_connections)
TIMESTAMP=$(date '+%F %T')
echo "[$TIMESTAMP] 当前连接数: $CONNECTIONS(连续成功 $SUCCESS_COUNT/$REQUIRED_SUCCESS"
if [ "$CONNECTIONS" -eq 0 ]; then
SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
if [ "$SUCCESS_COUNT" -ge "$REQUIRED_SUCCESS" ]; then
echo "[$TIMESTAMP] ✅ 检测通过: 端口 $PORT 已连续 $REQUIRED_SUCCESS 次无活跃连接"
exit 0
fi
else
SUCCESS_COUNT=0
fi
sleep "$CHECK_INTERVAL"
done
TIMESTAMP=$(date '+%F %T')
echo "[$TIMESTAMP] ❌ 超时: 在 ${TIMEOUT}s 内端口 $PORT 未达到连续 $REQUIRED_SUCCESS 次无活跃连接"
exit 1