Springboot微服务启动脚本和服务监控脚本(shell)
分享一个Springboot微服务启动脚本和服务监控脚本。
1. 启动脚本(存在则重启)
#!/bin/bash
# 定义JAR包路径
SERVICE_NAME="lotteryservice"
JAR_NAME="xcloud-lotteryservice-web-1.0-SNAPSHOT.jar"
SERVICE_PATH="/home/service/$SERVICE_NAME"
JAR_PATH="$SERVICE_PATH/$JAR_NAME"
PROFILE=prod
#PROFILE=alibaba
echo $JAR_PATH
# 检查是否存在运行的进程 存在即kill
function check_and_kill_process {
PID=$(ps -ef | grep "java -jar $JAR_PATH" | grep -v grep | awk '{print $2}')
echo $PID
if [ -n "$PID" ]; then
echo "Killing existing process with PID: $PID ($SERVICE_NAME)"
kill -9 $PID
sleep 5 # 等待进程完全终止
fi
}
# 启动服务
function start_service {
echo "Starting $SERVICE_NAME ..."
java -jar ${JAR_PATH} --spring.profiles.active=${PROFILE} &
echo "$SERVICE_NAME started."
}
# 执行检查并杀掉进程
check_and_kill_process
# 启动服务
start_service
2. 监控脚本
即服务健康检查,监控服务是否正常启动,未正常启动,则调用启动脚本
关键点:
1) 检查进程是否存在
2) 进程存在,检查是否僵死,请求健康检查URL,注意设置curl超时时间
#!/bin/bash
# 定义JAR包路径(这里可能不需要,但用于说明)
SERVICE_NAME="demoservice"
JAR_NAME="demoservice-web-1.0-SNAPSHOT.jar"
SERVICE_PATH="/home/service/$SERVICE_NAME"
JAR_PATH="$SERVICE_PATH/$JAR_NAME"
restartShell="$SERVICE_PATH/start.sh "
echo $JAR_PATH
# 定义服务健康检查URL
HEALTH_CHECK_URL="http://localhost:9999/health/check"
echo "[$(date +'%Y-%m-%d %H:%M:%S')][info]Begin check....."
# 检查是否存在运行的进程
function check_process {
PID=$(ps -ef | grep "java -jar $JAR_PATH" | grep -v grep | awk '{print $2}')
echo " PID is $PID"
if [ -n "$PID" ]; then
return 0 # 进程存在
else
return 1 # 进程不存在
fi
}
# 发送HTTP请求到健康检查端点
function check_service_health {
# 设置 curl 的超时时间,例如设置为5秒 整体不超过10秒
CURL_TIMEOUT=5
MAX_TIME=10
RESPONSE=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout $CURL_TIMEOUT --max-time $MAX_TIME $HEALTH_CHECK_URL)
# 检查 curl 的退出状态
CURL_EXIT_STATUS=$?
echo " CURL_EXIT_STATUS $CURL_EXIT_STATUS"
echo " RESPONSE CODE $RESPONSE"
# 如果 curl 因为超时而退出(退出状态为7),或者 HTTP 状态码不是200,返回1
if [ "$CURL_EXIT_STATUS" -ne 0 ] || [ "$RESPONSE" -ne 200 ]; then
return 1 # 返回1表示服务不健康
else
return 0 # 返回0表示服务健康
fi
}
# 如果进程不存在则重启 并推出
if ! check_process; then
echo "====[error] $SERVICE_NAME check_process is not exist, attempting to restart..."
# 调用启动脚本
nohup sh ${restartShell} >/dev/null 2>&1 &
exit 0 # 退出脚本,并返回状态码 0
fi
# 进程存在 继续检查服务健康状态,如果不健康则重启
if check_service_health; then
echo " $SERVICE_NAME is healthy."
else
echo "====[error] $SERVICE_NAME is not healthy, attempting to restart..."
# 调用启动脚本
nohup sh ${restartShell} >/dev/null 2>&1 &
fi
3. 设置crontab
根据自己需要设置定时任务
#每10分钟检测一次
*/10 * * * * /bin/sh /home/service/monitor.sh >> /home/service/health.log