SpringBoot启停脚本

时间:2025-03-12 09:09:11

由于工作需要,springboot需要脱离原有部署环境,在没有自动部署功能的前提下,为了防止人为误操作以及其他的一些原因,需要规范系统部署,但同时带了人工操作的复杂度,因此需要通过脚本控制来降低人工成本。

目录

1.前期准备

2.系统部署规范

3. 资源利用记录

4.服务启停脚本


1.前期准备

     springboot的前期工作不再赘述,环境搭建不是这里的重点,因此Java环境等等忽略

2.系统部署规范

      既然说要脚本完成启停,必然需要规范系统部署,规则如下

      2.1springboot结构相关
                 /                                                                                                                         --------------根目录

                 /apps                                                                                                                 --------------部署服务目录

                 /apps/xxx-sc(项目名称)                                                                                --------------日志文件目录

                 /apps/xxx-sc(项目名称)/logs                                                                        --------------项目日志目录

                 /apps/xxx-sc(项目名称)/logs/xxx.年月日                                                      --------------项目日志目录    (日志每日一切割,每50M一切割)
                 /apps/xxx-sc(项目名称)/                                                               --------------项目启停脚本

                 /apps/xxx-sc(项目名称)/service/xxx-sc-aaaa(项目名称-sc-端口号)         --------------项目日志名称                

                 /apps/xxx-sc(项目名称)/tmp                                                                         --------------临时jar                

                 /apps/xxx-sc(项目名称)/target                                                                      --------------target

    2.2数据库相关
                 /                                                                            --------------根目录

                 /apps                                                                    --------------部署服务目录

                /apps/dbconfig                                                    --------------数据库文件目录
                /apps/dbconfig/数据库名字                                --------------数据库文件目录
3. 资源利用记录

       由于同一个服务器可能存在多服务情况,为了防止相互之间端口占用的影响,需要资源备案进行分配

 

项目名称 域名 框架 环境 http端口号 Shutdown端口 AJP端口 数据库
xxx springboot 生产 8989     xxx
xxx-nc   springboot 内测 8988     xxx-nc
ppp   tomcat 生产 8987 8187 8287 ppp
ppp-nc   tomcat 内测 8986 8186 8286 ppp-nc
        8985      

4.服务启停脚本

目录名称 目录说明 备注
xxx-sc 项目所在目录

xxx:项目名称

sc:生产环境

nc:内测环境

xxx-sc-aaaa 项目名称 aaa:端口号
springboot项目启停脚本

启动: start

停止: stop

重启: restart

上线: push

回滚: rollback

状态查询: status

     

 

        由于shell脚本不是特别熟悉,有什么更好的方式可以达成目标,欢迎大家指点

#!/bin/sh
## java env
#export JAVA_HOME=/usr/local/jdk/jdk1.8.0_101
#export JRE_HOME=$JAVA_HOME/jre

echo
echo "**********************环境检测 开始**********************"
`java -version`
echo
service_path=`ls -lt ./service/ | find ./service -name "*.jar"`
echo ">>> 服务路径地址: $service_path"
service_name=${service_path##*/}
echo ">>> 服务JAR名称: $service_name"
tmp_path=`ls -lt ./tmp/ | find ./tmp -name "*.jar"`
echo ">>> 临时文件路径: "$tmp_path
tmp_name=${tmp_path##*/}
echo ">>> 临时JAR名称: "$tmp_name
echo "**********************环境检测 结束**********************"
echo 
echo

API_NAME=$service_path
JAR_NAME=$service_name


#使用说明,用来提示输入参数
usage() {
    echo "Usage: sh 执行脚本.sh [start|stop|restart|status|push|rollback]"
    exit 1
}

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

#启动方法
start(){
  echo "**********************启动服务 开始**********************"
  is_exist
  if [ $? -eq "0" ]; then 
    echo ">>> 服务 ${JAR_NAME} 已经在运行中, PID=${pid} <<<" 
  else
    nohup java -jar $service_path >/dev/null 2>&1 &
    getPID
	    if [ $? -eq "0" ]; then
	    	echo ">>> 服务 $JAR_NAME 启动失败 <<<"  
	    else
	    	echo ">>> 服务 $JAR_NAME 启动成功 PID=$! <<<"
	    fi
   fi
   echo "**********************启动服务 完成**********************"
  }

#停止方法
stop(){
	echo "**********************关闭服务 开始**********************"
  is_exist  
	if [ $? -eq "1" ]; then
	  echo ">>> 无服务运行中"
	else
	  pid=`ps -ef|grep $JAR_NAME|grep -v grep|awk '{print $2}' `
	  echo ">>> 服务运行中,PID=$pid . 开始关闭服务."
	  kill -9 $pid
	  echo ">>> 服务已停止."
	fi
	echo "**********************关闭服务 完成**********************"
}

#输出运行状态
status(){
	echo "**********************查询服务状态 开始**********************"
  is_exist
  if [ $? -eq "0" ]; then
    echo ">>> 服务 ${JAR_NAME} is running PID is ${pid} <<<"
  else
    echo ">>> 服务 ${JAR_NAME} is not running <<<"
  fi
  echo "**********************查询服务状态 完成**********************"
}

#重启
restart(){
	echo "**********************重启服务 开始**********************"
  stop
  echo
  start
  echo "**********************重启服务 完成**********************"
}

#上线
push(){
	echo "**********************上线服务 开始**********************"
	stop
	echo
	rmJar
	echo
	start
	echo "**********************上线服务 完成**********************"
}

#回滚
rollback(){
	echo "**********************回滚服务 开始**********************"
	stop
	echo
	rollBackJar
	echo
	start
	echo "**********************回滚服务 完成**********************"
}

rmJar() {
	current=`date "+%Y%m%d%H%M%S"`
	jar_new_anme=$JAR_NAME-$current
	
	cp $API_NAME ./target/$jar_new_anme
	echo ">>> 历史服务备份完成,备份文件:"  $jar_new_anme
	
	rm -rf $API_NAME
	echo ">>> 移除运行中文件:" + $API_NAME
	
	cp ./tmp/$tmp_name $API_NAME
	echo ">>> 拷贝最新jar包并加载:" + $tmp_name
	
	rm -rf ./tmp/$tmp_name
	echo ">>> 移除临时jar包:" + $tmp_name
}

rollBackJar() {
	target_jar=`ls -lt ./target/ | grep $JAR_NAME | head -n 1 |awk '{print $9}'`
	
	echo ">>> 获取历史服务备份文件:"  $target_jar
	cp ./target/$target_jar $API_NAME
	echo ">>> 加载历史服务备份文件 $target_jar 回滚为 $API_NAME"
}

getPID() {
	pid=`ps -ef|grep $JAR_NAME|grep -v grep|awk '{print $2}' `
	if [ -z "${pid}" ]; then
   	echo ">>> 服务 $JAR_NAME 未运行"
   	return 1
  else 
  	echo ">>> 服务 $JAR_NAME 运行中"
    return ${pid}
  
  fi
}

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