#!/bin/bash #这里可替换为你自己的执行程序 APP_NAME=api-web JAR_NAME=${APP_NAME}-1.0.0.jar ERP_PATH="/opt/sdm-erp/java/service/" APP_PATH="${ERP_PATH}${APP_NAME}" CURRENT_DIR=$(cd $(dirname $0); pwd)

检测服务端口是否可用

定义变量

server_ip="localhost" server_port="9040" check_url="http://${server_ip}:${server_port}/healthInfo" result=$(curl --connect-timeout 3 -S "${check_url}" 2>&1) TRUEINFO=$(echo $result | sed 's/</br>\n/g') ERRINFO=$(echo $result | sed 's/.Connection timed out./警告:$APP_NAME 服务端口检测超时,请排查!/') CURRENT_DIR=$(cd $(dirname $0); pwd) function RED(){ echo -e "\033[31m$@\033[0m" }

function GRE(){ echo -e "\033[36m$@\033[0m" } #使用说明,用来提示输入参数 usage() { RED "Usage: sh operate.sh [start|stop|restart|status]" exit 1 }

#检查程序是否在运行 is_exist(){ pid=ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}' #如果不存在返回1,存在返回0 if [ -z "${pid}" ]; then return 1 else return 0 fi }

#启动方法 start(){ is_exist if [ $? -eq "0" ]; then GRE "${APP_NAME} is already running. pid=${pid} ." else #增加重试次数和重试间隔 RETRY=3 SLEEP_TIME=10 for i in $(seq 1 $RETRY) do GRE "${APP_NAME} 启动中,第 ${i} 次尝试..." nohup java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5008 -jar $APP_PATH$JAR_NAME >${CURRENT_DIR}/log.log 2>&1 & sleep $SLEEP_TIME is_exist if [ $? -eq "0" ]; then GRE "${APP_NAME} 启动成功. pid=${pid} ." break else GRE "${APP_NAME} 启动失败,请等待 ${SLEEP_TIME} 秒后重试..." fi done #发送错误通知到企业微信群 if [ $? -eq "1" ]; then RED "${APP_NAME} 启动失败,已发送错误通知到企业微信群!" curl -H "Content-Type: application/json;charset=utf-8" -d "{"msgtype": "markdown","markdown": {"content":"# [开发环境]-[JAVA后端]-[存活探测]\n >## \n$ERRINFO "}}" "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=04a90303-2a83-4fd3-b315-9b12cf25484a" fi #增加等待程序完全启动的逻辑 for i in $(seq 1 $RETRY) do result=$(curl --connect-timeout 3 -S "${check_url}" 2>&1) TRUEINFO=$(echo $result | sed 's/</br>\n/g') if [ $? -eq "0" ]; then GRE "${APP_NAME} 启动完成." GRE "${TRUEINFO}" #将启动日志输出到控制台和日志文件中 cat ${CURRENT_DIR}/log.log break else GRE "${APP_NAME} 启动中,请等待 ${SLEEP_TIME} 秒后重试..." fi sleep $SLEEP_TIME done #发送成功通知到企业微信群 if [ $? -eq "0" ]; then GRE "${APP_NAME} 启动正常,已发送成功通知到企业微信群!" curl -H "Content-Type: application/json;charset=utf-8" -d "{"msgtype": "markdown","markdown": {"content":"# [开发环境]-[JAVA后端]-[存活探测]\n >## \n$TRUEINFO "}}" "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=04a90303-2a83-4fd3-b315-9b12cf25484a" fi fi }

#停止方法 stop(){ is_exist if [ $? -eq "0" ]; then kill -9 $pid #增加等待程序停止的逻辑 for i in $(seq 1 $RETRY) do is_exist if [ $? -eq "1" ]; then GRE "${APP_NAME} 已成功停止." break else GRE "${APP_NAME} 正在停止中,请等待 ${SLEEP_TIME} 秒后重试..." fi sleep $SLEEP_TIME done else GRE "${APP_NAME} 未运行,无需停止." fi }

#输出运行状态 status(){ is_exist if [ $? -eq "0" ]; then GRE "${APP_NAME} 正在运行. Pid 为 ${pid} ." #增加对程序的运行状态进行更详细的描述 GRE "状态:运行中" GRE "端口:${server_port}" else GRE "${APP_NAME} 未运行." #增加对程序的运行状态进行更详细的描述 GRE "状态:未运行" fi }

#重启 restart(){ stop start }

#根据输入参数,选择执行对应方法,不输入则执行使用说明 case "$1" in "start") start ;; "stop") stop ;; "status") status ;; "restart") restart ;; *) usage ;; esac

优化和验证 Java 应用启动脚本:提高可靠性与可观测性

原文地址: https://www.cveoy.top/t/topic/mVSA 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录