Files
2025-10-07 15:58:15 +08:00

265 lines
8.6 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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