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
|