Jar包启动管理脚本分享

328 阅读3分钟

概述

最近要给客户私有化部署,由于服务器资源有限,没法使用docker或k8s部署,只能使用Jar包启动方式管理Spring Boot应用程序的启动、停止、重启和状态检查。脚本通过PID文件管理进程,支持在后台和终端两种模式下运行应用程序。本人是后端开发,对shell脚本不是太精通就一边写脚本一边让ChatGpt帮忙优化,结果出乎意料。细节优化的太到位了。

脚本内容

#!/bin/bash

# Spring Boot应用程序的名称
APP_BASE_NAME="you-app-name"

# PID目录
RUN_DIR="you-app-run-dir"

# 获取脚本所在目录
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

# 检查Spring Boot应用程序是否正在运行
is_running() {
    if [ -f "$PID_FILE" ]; then
        PID=$(cat "$PID_FILE")
        if [ -n "$PID" ] && ps -p "$PID" > /dev/null 2>&1; then
            return 0
        fi
    fi
    return 1
}

# 启动Spring Boot应用程序
start() {
    if is_running; then
        echo "$APP_NAME is already running."
    else
        echo "Starting $APP_NAME..."
        CMD="nohup java -Dlogging.config="$LOGBACK_PATH" -jar "$JAR_PATH" --spring.profiles.active="$ENV" >/dev/null 2>&1 &"
        echo $CMD
        eval $CMD
        echo $! > "$PID_FILE"
        echo "$APP_NAME started."
    fi
}

# 以终端打印日志的方式启动Spring Boot应用程序
starting() {
    if is_running; then
        echo "$APP_NAME is already running."
    else
        echo "Starting $APP_NAME and logging to terminal..."
        CMD="java -Dlogging.config="$LOGBACK_PATH" -jar "$JAR_PATH" --spring.profiles.active="$ENV""
        echo $CMD
        eval $CMD
    fi
}

# 停止Spring Boot应用程序
stop() {
    if is_running; then
        PID=$(cat "$PID_FILE")
        kill "$PID"
        # 等待进程完全退出
        while is_running; do
            echo "Waiting for $APP_NAME to stop..."
            sleep 1
        done
        rm -f "$PID_FILE"
        echo "$APP_NAME stopped."
    else
        echo "$APP_NAME is not running."
    fi
}

# 重启Spring Boot应用程序
restart() {
    stop
    start
}

# 查看Spring Boot应用程序状态
status() {
    if is_running; then
        PID=$(cat "$PID_FILE")
        echo "$APP_NAME is running (PID: $PID)."
    else
        echo "$APP_NAME is not running."
    fi
}

# 显示帮助信息
help() {
    echo "Usage: $0 <jar_path> <env> <logback_path> {start|stop|restart|status|starting|help}"
    echo
    echo "Commands:"
    echo "  start      Start the Spring Boot application"
    echo "  stop       Stop the Spring Boot application"
    echo "  restart    Restart the Spring Boot application"
    echo "  status     Show the status of the Spring Boot application"
    echo "  starting   Start the Spring Boot application and log to terminal"
    echo "  help       Show this help message"
    echo
    echo "Environment:"
    echo "  env        The environment configuration to use (e.g., pre, prod)"
    echo "  logback_path The path to the logback configuration file"
}

# 脚本的主入口
if [ $# -lt 4 ]; then
    help
    exit 1
fi

JAR_PATH=$1
ENV=$2
LOGBACK_PATH=$3
APP_NAME="${APP_BASE_NAME}-${ENV}"
PID_FILE="$RUN_DIR/$APP_NAME.pid"
shift 3

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        restart
        ;;
    status)
        status
        ;;
    starting)
        starting
        ;;
    help)
        help
        ;;
    *)
        help
        exit 1
        ;;
esac

exit 0

脚本参数

脚本需要传入以下参数:

  1. JAR_PATH:Spring Boot应用程序的jar文件路径。
  2. ENV:运行环境配置(例如:pre, prod)。
  3. LOGBACK_PATH:logback配置文件的路径。
  4. 命令:执行的操作(start, stop, restart, status, starting, help)。

使用方法

./script.sh <jar_path> <env> <logback_path> {start|stop|restart|status|starting|help}

例如:

./script.sh /path/to/your-app.jar prod /path/to/logback.xml start

脚本说明

变量说明

  • APP_BASE_NAME:Spring Boot应用程序的基础名称。
  • RUN_DIR:PID文件的存储目录。
  • SCRIPT_DIR:脚本所在目录。
  • PID_FILE:存储Spring Boot应用程序进程ID的文件。

功能函数

is_running()

检查Spring Boot应用程序是否正在运行。若运行则返回0,否则返回1。

start()

启动Spring Boot应用程序。如果应用程序已经在运行,提示用户,否则启动应用程序并将其运行在后台。

starting()

以终端打印日志的方式启动Spring Boot应用程序。

stop()

停止Spring Boot应用程序。如果应用程序正在运行,发送终止信号并等待进程退出,然后删除PID文件。

restart()

重启Spring Boot应用程序,先调用stop函数,再调用start函数。

status()

查看Spring Boot应用程序的状态。如果应用程序正在运行,输出进程ID,否则提示应用程序未运行。

help()

显示帮助信息,包括脚本的用法、命令说明和环境变量说明。

主入口

脚本根据传入的参数执行相应的命令。若参数不足或命令无效,将显示帮助信息。

示例

启动应用程序

./script.sh /path/to/your-app.jar prod /path/to/logback.xml start

停止应用程序

./script.sh /path/to/your-app.jar prod /path/to/logback.xml stop

重启应用程序

./script.sh /path/to/your-app.jar prod /path/to/logback.xml restart

查看应用程序状态

./script.sh /path/to/your-app.jar prod /path/to/logback.xml status

以终端打印日志的方式启动应用程序

./script.sh /path/to/your-app.jar prod /path/to/logback.xml starting

显示帮助信息

./script.sh /path/to/your-app.jar prod /path/to/logback.xml help

注意

  • 确保脚本具有可执行权限,使用 chmod +x script.sh 设置权限。
  • 确保运行脚本的用户对PID文件目录有写权限。
  • 适当调整RUN_DIR以符合你的系统环境。