✅ 功能说明
- 使用
ss
或netstat
获取当前系统中所有 TCP 连接。 - 统计状态为
CLOSE_WAIT
的连接数量。 - 如果数量大于指定阈值(如 10),则发送告警通知。
📦 最终优化脚本:monitor_close_wait.sh
#!/bin/bash
# 配置项
THRESHOLD=10
CHECK_CLOSE_WAIT_CMD="ss -ant | awk '\$1 == \"CLOSE-WAIT\" {count++} END {print count+0}'"
CHECK_PORT=8080
TIMEOUT=1
# 钉钉机器人 Webhook 地址(替换为你自己的)
SEND_DINGTALK=true
DINGTALK_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" ]]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') 错误:无法获取 CLOSE_WAIT 连接数,请确认命令是否执行成功。"
exit 1
fi
# 检查连接数
if (( CLOSE_WAIT_COUNT > THRESHOLD )); then
# 检查本地 8080 端口是否可访问(使用 curl 检测本地 TCP 连接)
if timeout "$TIMEOUT" bash -c "</dev/tcp/127.0.0.1/$CHECK_PORT"; then
PORT_STATUS="✅ 端口 $CHECK_PORT 可访问"
else
PORT_STATUS="❌ 端口 $CHECK_PORT 不可访问或超时(${TIMEOUT}s)"
fi
MESSAGE="⚠️【系统告警】检测到 CLOSE_WAIT 连接异常!
【主机名】: $HOSTNAME
【IP地址】: $IP_ADDRESS
【当前 CLOSE_WAIT 数量】: $CLOSE_WAIT_COUNT
【阈值】: $THRESHOLD
【服务端口状态】: $PORT_STATUS
请及时检查应用连接释放情况,避免资源泄漏。"
echo "$MESSAGE"
# 发送钉钉消息
if $SEND_DINGTALK; then
JSON_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/null
fi
else
echo "$(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