✅ 功能说明
使用 ss或netstat获取当前系统中所有 TCP 连接。统计状态为 CLOSE_WAIT的连接数量。如果数量大于指定阈值(如 10),则发送告警通知。
📦 最终优化脚本:monitor_close_wait.sh
# 配置项THRESHOLD=10CHECK_CLOSE_WAIT_CMD="ss -ant | awk '\$1 == \"CLOSE-WAIT\" {count++} END {print count+0}'"CHECK_PORT=8080TIMEOUT=1# 钉钉机器人 Webhook 地址(替换为你自己的)SEND_DINGTALK=trueDINGTALK_WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=你的token"# 获取机器信息HOSTNAME=$(hostname)IP_ADDRESS=$(hostname -I | awk '{print $1}')# 获取 CLOSE_WAIT 数量CLOSE_WAIT_COUNT=$(eval "$CHECK_CLOSE_WAIT_CMD" 2>/dev/null)if [[ -z "$CLOSE_WAIT_COUNT" ]]; thenecho "$(date '+%Y-%m-%d %H:%M:%S') 错误:无法获取 CLOSE_WAIT 连接数,请确认命令是否执行成功。"exit 1fi# 检查连接数if (( CLOSE_WAIT_COUNT > THRESHOLD )); then# 检查本地 8080 端口是否可访问(使用 curl 检测本地 TCP 连接)if timeout "$TIMEOUT" bash -c "</dev/tcp/127.0.0.1/$CHECK_PORT"; thenPORT_STATUS="✅ 端口 $CHECK_PORT 可访问"elsePORT_STATUS="❌ 端口 $CHECK_PORT 不可访问或超时(${TIMEOUT}s)"fiMESSAGE="⚠️【系统告警】检测到 CLOSE_WAIT 连接异常!【主机名】: $HOSTNAME【IP地址】: $IP_ADDRESS【当前 CLOSE_WAIT 数量】: $CLOSE_WAIT_COUNT【阈值】: $THRESHOLD【服务端口状态】: $PORT_STATUS请及时检查应用连接释放情况,避免资源泄漏。"echo "$MESSAGE"# 发送钉钉消息if $SEND_DINGTALK; thenJSON_DATA=$(cat <<EOF{"msgtype": "text","text": {"content": "$MESSAGE","at": {"isAtAll": false}}}EOF)curl -s -H "Content-Type: application/json" -d "$JSON_DATA" "$DINGTALK_WEBHOOK" > /dev/nullfielseecho "$(date '+%Y-%m-%d %H:%M:%S') 当前 CLOSE_WAIT 连接数为 $CLOSE_WAIT_COUNT,未超过阈值 $THRESHOLD。"fi
🧪 示例钉钉报警消息内容
⚠️【系统告警】检测到 CLOSE_WAIT 连接异常!【主机名】: web-server-01【IP地址】: 192.168.1.10【当前 CLOSE_WAIT 数量】: 15【阈值】: 10【服务端口状态】: ❌ 端口 8080 不可访问或超时(1s)请及时检查应用连接释放情况,避免资源泄漏。
🕒 设置定时任务(crontab)
crontab -e添加如下内容,每5分钟运行一次监控*/5 * * * * /opt/monitor_close_wait.sh >> /var/log/close_wait_monitor.log 2>&1