#!/bin/bash # 等待指定端口的连接数连续3次为0(每次间隔5秒) # 使用方法: wait_s1_for_connections.sh # 示例: 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 " 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 # 示例: 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 " 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 # 示例: 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 " 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 [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 [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