背景:
系统刚上线,需要监控各网格服务的运行状态,仅靠人工监控,费事费力,费成本。但还要满足系统需求,还需要满足领导的要求。于是乎,开干~
实现思路:
编写脚本,加入定时任务,配置服务异常邮件告警,最好结合SpringBoot 多应用管理脚本实现,这篇文章使用。当然也可自行改造。
监控内容:
1. 检查期望的服务列表是否运行。
2. 显示运行服务的详细状态(服务名、PID、运行状态、运行时长、CPU使用率、物理内存、线程数 )。
3. 对停止的服务进行告警。
4. 支持邮件和企业微信两种告警方式(脚本里配置)。
开干上脚本:
都是热乎的,刚用,小伙伴们估计看到了,有2.0版本,晚会上:

java_health_checker1.0.sh
#!/bin/bash
# ==============================================================================
# Java服务状态监控脚本 (健康检查与告警完整版)
# 功能:
# 1. 检查期望的服务列表是否运行。
# 2. 显示运行服务的详细状态。
# 3. 对停止的服务进行告警。
# 4. 支持邮件和企业微信两种告警方式。
# ==============================================================================
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# ==============================================================================
# 配置区域:请在这里修改配置
# ==============================================================================
# --- 期望监控的服务列表 ---
# 格式: "服务名:端口号"
EXPECTED_SERVICES=(
"model:8286"
"esb:8285"
*****服务自定义(根据实际情况修改)
)
# --- 邮件告警设置 (方案一) ---
EMAIL_ENABLED=false # true:启用, false:禁用
EMAIL_TO="*****@dtestcom" # 接收告警的邮箱
EMAIL_SUBJECT="[******] Java服务健康检查报告" # 邮件主题
# --- 企业微信告警设置 (方案二) ---
WECHAT_ENABLED=false # true:启用, false:禁用
# 请替换为您自己的企业微信机器人Webhook地址
WECHAT_WEBHOOK_URL="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY_HERE"
# ==============================================================================
# 打印标题
echo -e "${BLUE}============================================${NC}"
echo -e "${BLUE} ****** $(hostname) Java服务健康巡检报告${NC}"
echo -e "${BLUE} $(date '+%Y-%m-%d %H:%M:%S')${NC}"
echo -e "${BLUE} 当前IP:$(hostname -I | awk '{print $1}')${NC}"
echo -e "${BLUE}============================================${NC}"
# 创建一个关联数组,用于存储正在运行的服务信息
declare -A running_services
# --- 1. 扫描并收集所有正在运行的Java服务信息 ---
echo -e "${GREEN}🔍 正在扫描当前运行的Java服务...${NC}"
echo ""
# 使用pgrep获取所有Java进程的PID
java_pids=$(pgrep -f java)
if [ -n "$java_pids" ]; then
for pid in $java_pids; do
# 获取完整命令行
full_cmd=$(ps -p $pid -o cmd=)
if [[ "$full_cmd" != *"java"* ]]; then
continue
fi
# 提取服务名和端口
service_name=$(echo "$full_cmd" | grep -oP 'SW_AGENT_NAME=\K[^ ]+' | head -1)
if [ -z "$service_name" ]; then
service_name=$(echo "$full_cmd" | grep -oP '\-jar\s+\K[^\.]+' | head -1)
fi
#port=$(echo "$full_cmd" | grep -oP 'server\.port=\K\d+' | head -1)
port=$(echo "$full_cmd" | grep -oP 'D?server\.port=\K\d+' | head -1)
# 如果服务名和端口都有效,存入数组
if [ -n "$service_name" ] && [ -n "$port" ]; then
running_services["${service_name}:${port}"]="$pid"
fi
done
fi
# --- 2. 检查期望的服务状态 ---
echo -e "${BLUE}📋 开始检查期望的服务状态...${NC}"
echo ""
down_services_count=0
down_services_list=""
# 遍历期望的服务列表
for expected_service in "${EXPECTED_SERVICES[@]}"; do
if [[ -n "${running_services[$expected_service]}" ]]; then
# 服务正在运行
pid=${running_services[$expected_service]}
service_name=${expected_service%:*}
# 获取运行时信息
etime=$(ps -p $pid -o etime= | tr -d ' ')
cpu_usage=$(ps -p $pid -o %cpu= | tr -d ' ')
mem_rss=$(ps -p $pid -o rss= | tr -d ' ')
threads=$(ps -p $pid -o nlwp= | tr -d ' ')
mem_rss_mb=$(echo "$mem_rss" | awk '{printf "%.0f", $1/1024}')
echo -e "${GREEN}✅ ${service_name} (PID: ${pid}) - 运行正常${NC}"
printf " %-10s: %s\n" "运行时长" "$etime"
printf " %-10s: %s%%\n" "CPU使用率" "$cpu_usage"
printf " %-10s: %s MB\n" "物理内存" "$mem_rss_mb"
printf " %-10s: %s\n" "线程数" "$threads"
echo ""
else
# 服务停止或异常
service_name=${expected_service%:*}
echo -e "${RED}❌ ${service_name} - 服务停止或异常!${NC}"
((down_services_count++))
down_services_list="${down_services_list} ${service_name}"
fi
done
# --- 3. 最终报告与告警发送 ---
echo -e "${BLUE}============================================${NC}"
if [ "$down_services_count" -eq 0 ]; then
echo -e "${GREEN}🎉 所有期望的服务都在正常运行!${NC}"
else
echo -e "${RED}⚠️ 发现 ${down_services_count} 个服务存在问题,请立即检查!${NC}"
# --- 发送邮件告警 ---
if [ "$EMAIL_ENABLED" = true ]; then
echo -e "${YELLOW}📧 正在发送告警邮件到 $EMAIL_TO ...${NC}"
email_body=$(cat <<EOF
服务器 $(hostname) 上的Java服务健康检查发现异常!
时间: $(date '+%Y-%m-%d %H:%M:%S')
异常服务数量: $down_services_count
异常服务列表:
$down_services_list
请登录服务器检查详细情况。\n
EOF
)
echo "$email_body" | mailx -s "$EMAIL_SUBJECT - [ALERT]" "$EMAIL_TO"
if [ $? -eq 0 ]; then
echo -e "${GREEN}✅ 告警邮件发送成功!${NC}"
else
echo -e "${RED}❌ 告警邮件发送失败!请检查邮件配置。${NC}"
fi
fi
# --- 发送企业微信告警 ---
if [ "$WECHAT_ENABLED" = true ]; then
echo -e "${YELLOW}📱 正在发送企业微信告警...${NC}"
# 构建JSON消息体
message=$(cat <<EOF
{
"msgtype": "markdown",
"markdown": {
"content": "<font color='warning'>【$(hostname)服务告警】</font>\n\n> 服务器: <code>prd1</code>\n> 时间: <code>$(date '+%Y-%m-%d %H:%M:%S')</code>\n> 异常服务数: <code>$down_services_count</code>\n> 异常列表: <code>${down_services_list//\\n/ }</code>\n\n请立即登录服务器检查!"
}
}
EOF
)
# 发送HTTP请求
curl -s -X POST "$WECHAT_WEBHOOK_URL" \
-H "Content-Type: application/json" \
-d "$message" > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo -e "${GREEN}✅ 企业微信告警发送成功!${NC}"
else
echo -e "${RED}❌ 企业微信告警发送失败!请检查Webhook URL和网络。${NC}"
fi
fi
fi
echo -e "${BLUE}============================================${NC}"
# 如果有服务停止,脚本的退出码为1,便于告警系统识别
if [ "$down_services_count" -gt 0 ]; then
exit 1
fi
效果展示:



其他功能:
1、可配置邮件通知。
2、使用crontab定时巡检。
因为时间有限,这些之前文章也提到过,可自行配置。

21万+

被折叠的 条评论
为什么被折叠?



