Springboot项目maven包工程打包linux服务器启动、停止、重启shell脚本

﹥>﹥吖頭↗ 提交于 2019-12-02 22:16:54

搭建项目

  • src
    • bin
      • run.sh
    • main
    • pom.xml

配置pom文件

<build>
        <finalName>${project.artifactId}</finalName>
        <plugins>
            <!--拷贝依赖 copy-dependencies-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>
                                ${project.build.directory}/deploy/lib/
                            </outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <!-- 拷贝资源文件 copy-resources-->
            <plugin>
                <artifactId>maven-resources-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-resources</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <resources>
                                <resource>
                                    <directory>src/bin</directory>
                                </resource>
                            </resources>
                            <outputDirectory>${project.build.directory}/deploy/bin</outputDirectory>
                        </configuration>
                    </execution>
                    <execution>
                        <id>copy-classes</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <resources>
                                <resource>
                                    <directory>${project.build.directory}/classes</directory>
                                </resource>
                            </resources>
                            <outputDirectory>${project.build.directory}/deploy/classes</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

配置启动脚本run.sh

  • 创建脚本run.sh,内容如下
  • 修改MAIN_CLASS为启动类名称

常用执行命令
./run.sh start 启动
./run.sh stop 停止
./run.sh restart 重启
./run.sh status 查看启动状态

#!/bin/bash

# 根目录
PACKAGE_HOME=$(cd "$(dirname "$0")";cd ..;pwd)

# Java程序主体所在的目录,即classes的上一级目录
MAIN_CLASS=cn.teleinfo.bussiness.embed.NbmsWebApp

# PID文件位置
PID_LOCATION=$PACKAGE_HOME/bin/.pid
PID_LOCAL=0

# 日志的默认输出目录
LOG_DIR=$PACKAGE_HOME/logs
LOG_BASE_NAME=debug.log

# JVM启动参数
# -server:一定要作为第一个参数,多个CPU时性能佳
# -Xloggc:记录GC日志,建议写成绝对路径,如此便可在任意目录下执行该shell脚本
JAVA_OPTS=${JVM_OPTS:-"-server -Xms1024m -Xmx2048m -Xloggc:$LOG_DIR/gc.log"}

# classpath
CLASSPATH="${PACKAGE_HOME}/classes:${PACKAGE_HOME}/lib/*"

# 初始化全局变量,用于标识交易前置系统的PID(0表示未启动)
tradePortalPID=()

# 获取Java应用的PID
# ------------------------------------------------------------------------------------------------------
# 说明:通过JDK自带的jps命令,联合Linux中的grep命令,可以准确查找到Java应用的PID
#       [jps -l]表示显示Java主程序的完整包路径
#       awk命令可以分割出PID($1部分)及Java主程序名称($2部分)
# 例子:[$JAVA_HOME/bin/jps -l | grep $MAIN_CLASS]命令执行,会看到[5775 com.cucpay.tradeportal.MainApp]
# 另外:这个命令也可以取到程序的PID-->[ps aux|grep java|grep $MAIN_CLASS|grep -v grep|awk '{print $2}']
# ------------------------------------------------------------------------------------------------------
function getTradeProtalPID(){
    tradePortalPID=(`ps x | grep $MAIN_CLASS | grep -v grep | awk '{print $1}'`)
}

# 启动Java应用程序
# ------------------------------------------------------------------------------------------------------
# 1、调用getTradeProtalPID()函数,刷新$tradePortalPID全局变量
# 2、若程序已经启动($tradePortalPID不等于0),则提示程序已启动
# 3、若程序未被启动,则执行启动命令
# 4、启动命令执行后,再次调用getTradeProtalPID()函数
# 5、若步骤4执行后,程序的PID不等于0,则打印Success,反之打印Failed
# 注意:[echo -n]表示打印字符后不换行
# 注意:[nohup command > /path/nohup.log &]是将作业输出到nohup.log,否则它会输出到该脚本目录下的nohup.out中
# ------------------------------------------------------------------------------------------------------
function startup(){
    getTradeProtalPID
    if [ ! -d $LOG_DIR ]; then
        mkdir -p $LOG_DIR
    fi
    echo "==============================================================================================="
    if [ ${#tradePortalPID[@]} -ne 0 ]; then
        read -t 5 -p "$MAIN_CLASS already started(PID=${tradePortalPID[*]}), do want need create a new server? [y/n]" flag
        case $flag in 
            [yY]*)
                rm -f $PID_LOCATION
                echo -n "Starting $MAIN_CLASS"
                nohup java $JAVA_OPTS -classpath $CLASSPATH $MAIN_CLASS >/dev/null 2>&1 & echo $! > $PID_LOCATION
                PID_LOCAL=`head -n +1 $PID_LOCATION`
                echo "(PID=$PID_LOCAL)...[Success]"
                echo "==============================================================================================="
                sleep 1
                tail -f $LOG_DIR/$LOG_BASE_NAME
                ;;
            [nN]*)
                    echo "[Canceld]"
                    echo "==============================================================================================="
            ;;
            *)
                    echo "please enter : y or n"
                    echo "==============================================================================================="      
            ;;
        esac
    else
        nohup java $JAVA_OPTS -classpath $CLASSPATH $MAIN_CLASS >/dev/null 2>&1 & echo $! > $PID_LOCATION
        PID_LOCAL=`head -n +1 $PID_LOCATION`
        echo "(PID=$PID_LOCAL)...[Success]"
        echo "==============================================================================================="
        sleep 1
        tail -f $LOG_DIR/$LOG_BASE_NAME
    fi
}

function shutdown(){
    getTradeProtalPID
    echo "==============================================================================================="
    if [ -f "$PID_LOCATION" ];then
        PID_LOCAL=`head -n +1 $PID_LOCATION`
    fi
    if [ $PID_LOCAL -ne 0 ]; then
        echo -n "Stopping $MAIN_CLASS(PID=$PID_LOCAL) waiting 5s ..."
        kill $PID_LOCAL
        sleep 5
        getTradeProtalPID
        if echo "${tradePortalPID[@]}" | grep -w "$PID_LOCAL" &>/dev/null; then
            echo "[Failed]"
            echo "==============================================================================================="
            shutdown
        fi
        rm -f $PID_LOCATION
        echo "[Success]"
        echo "==============================================================================================="
    else
        if [ ${#tradePortalPID[@]} -ne 0 ]; then
            read -t 5 -p "$MAIN_CLASS already started(PID=${tradePortalPID[*]}), do want stop all server? [y/n]" flag
            case $flag in 
                [yY]*)
                    for item in ${tradePortalPID[*]}
                    do
                        echo "[Kill PID=$item waiting 5s ...]"
                        kill $item
                        sleep 5
                    done
                    echo "==============================================================================================="
                    shutdown
                ;;
                [nN]*)
                    echo "[Canceld]"
                    echo "==============================================================================================="
                ;;
                *)
                    echo "please enter : y or n"
                    echo "==============================================================================================="      
                ;;
            esac
        else 
            rm -f $PID_LOCATION
            echo "[Success]"
            echo "==============================================================================================="
        fi
    fi
}

function docker(){
    if [ ! -d $LOG_DIR ]; then
	    mkdir $LOG_DIR
	fi
    nohup java $JAVA_OPTS -classpath $CLASSPATH $MAIN_CLASS >/dev/null 2>&1 & echo $! > $PID_LOCATION
}

function status(){
    if [ -f "$PID_LOCATION" ];then
        PID_LOCAL=`head -n +1 $PID_LOCATION`
    fi
    echo "==============================================================================================="
    if [ $PID_LOCAL -ne 0 ]; then
        echo "$MAIN_CLASS already started(PID=$PID_LOCAL)"
        echo "==============================================================================================="
        tail -f $LOG_DIR/$LOG_BASE_NAME
    else
        echo "$MAIN_CLASS is not running"
        echo "==============================================================================================="
    fi
}

case "$1" in
  start)
    startup
  ;;

  stop)
	shutdown
  ;;

  status)
  	status
    ;;

  docker)
      docker
   ;;

  restart)
    shutdown
    startup
  ;;

  *)
    echo "please use : ./run.sh {start|stop|restart|status}"
  ;;
esac
exit 0

打包部署

  1. 执行打包命令

    mvn clean package -Dmaven.test.skip=true 
    
  2. 打包后将deploy文件夹部署即可
    部署的文件

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!