265 lines
8.6 KiB
Bash
265 lines
8.6 KiB
Bash
#!/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
|