前言
自动化发布第一步:jar包发布脚本。在发布jar包时需要配置一些变量如jvm classpath等,如果每次都copy难免有出错的时候,所以形成一个自动化脚本,每次执行脚本即可。
直接上代码
sh start.sh start 启动服务
sh start.sh stop 关闭服务
sh start.sh restart 重启服务
sh start.sh status 服务状态
将一下代码写入到 start.sh
文件中
#!/bin/bash
#jar包目录
APP_PATH="/Users/zhiaiyahong/intelligentanswer-0.0.1-SNAPSHOT.jar"
#环境变量 如果没有环境变量设置为空即可 ,一般分为 dev test prod
ACTIVE=""
#web项目检查项目是否启动 此路径需要自己创建直接返回 ok 即可,不填写则经过默认时间后认为服务启动
WEB_CHECK_UEL="http://localhost:8091/check"
#console path 数据输出路径,即项目print的内容以及日志sdpt的内容会输出到此文件 /dev/null 为消失,其他具体文件为输出到指定文件
CONSOLE_PATH="/opt/ylbzj/logs/hup.out"
#预计项目多久可以启动或关闭
WEB_START_TIME=30
#项目关闭使用kill ,如果超过规定时间则执行kill -9
WEB_STOP_TIME_FORCE=10
#jvm配置 值依次如下
#元空间初始大小
#元空间最大
#新生代初始空间
#堆栈初始大小
#堆栈最大空间
#垃圾回收器
#启动模式 使用server
#设置时区
JAVA_OPTS="-XX:MetaspaceSize=512M
-XX:MaxMetaspaceSize=1024M
-XX:NewSize=3072M
-Xms10240m
-Xmx10240m
-XX:+UseG1GC
-Xss512k
-server
-Duser.timezone=GMT+08"
#检查服务是否在运行
is_running(){
pid=$(ps -ef |grep ${APP_PATH}|grep -v grep|awk '{print $2}')
#如果不存在返回1,存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
#运行服务,如果服务运行中则进行提示
start_service(){
echo "开始启动服务..."
is_running
if [ $? -eq "0" ]; then
echo "${APP_PATH} 已经在运行,线程id ${pid}";
else
#启动jar包,并且将输出仍入黑洞(即不保留输出)
nohup java $ACTIVE $JAVA_OPTS -jar $APP_PATH > $CONSOLE_PATH 2>&1 &
if [ -n "$WEB_CHECK_UEL" ]; then
i=1
start_ok=0
while [ $start_ok -eq 0 ]
do
if [ $WEB_START_TIME -lt $i ]; then
start_ok=1
break
fi
back=$(curl -s ${WEB_CHECK_UEL})
if [ "$back" == "ok" ]; then
start_ok=2
break
fi
echo "服务启动中(${i})..."
let i++
sleep 1
done
if [ $start_ok -eq 2 ]; then
echo "服务已启动"
else
echo "服务未在规定时间内正确影响(${WEB_START_TIME}),请检查日志"
fi
else
times=1
start_ok=0
while [ $start_ok -eq 0 ]
do
if [ $WEB_START_TIME -lt $times ]; then
start_ok=1
break
fi
is_running
if [ $? -eq "1" ]; then
echo "服务启动中(${times})...."
sleep 1
let times++
else
echo "进程已拉起"
start_ok=2
fi
done
if [ $start_ok -eq 1 ]; then
echo "服务未在规定时间内正确影响(${WEB_START_TIME}),请检查日志"
fi
fi
fi
}
# 停止服务,返回1标识已停止,2kill失败
stop_service(){
echo "即将关闭程序..."
is_running
if [ $? -eq "1" ]; then
echo "${APP_PATH} 未运行,无需停止";
return 1
else
echo "杀死进程(kill不带-9) ${pid}"
kill $pid
#kill 123
times=1
start_ok=0
use_force=0
while [ $start_ok -eq 0 ]
do
if [ $WEB_STOP_TIME_FORCE -lt $times ]; then
if [ $use_force -eq 0 ]; then
echo "服务未在规定时间关闭(${WEB_STOP_TIME_FORCE}),即将执行kill -9,重新计时"
kill -9 $pid
#kill -9 123
times=1
use_force=1
else
start_ok=1
break
fi
fi
is_running
if [ $? -eq "0" ]; then
echo "服务关闭中(${times})...."
sleep 1
let times++
else
echo "服务已关闭"
start_ok=2
fi
done
if [ $start_ok -eq 1 ]; then
echo "服务未在规定时间关闭(${WEB_STOP_TIME_FORCE}*2),请检查日志"
return 2
fi
return 1
fi
}
status(){
is_running
if [ $? -eq "0" ]; then
echo "${APP_PATH} 运行中,线程id ${pid}";
else
echo "${APP_PATH} 未运行";
fi
}
#重启服务
restart_service(){
echo "开始执行服务重启..."
stop_service
if [ $? -eq 1 ]; then
start_service
else
echo "服务未被关闭,无法重启服务,请人工排查"
fi
}
case "$1" in
"start")
start_service
;;
"stop")
stop_service
;;
"restart")
restart_service
;;
"status")
status
;;
*)
echo "命令为 start|stop|restart|status"
exit 0
;;
esac
网友评论