编写脚本在Linux下启动、停止SpringBoot工程

发布于:2025-03-21 ⋅ 阅读:(17) ⋅ 点赞:(0)

【1】启动命令

nohup java -jar your-application.jar > /dev/null 2>&1 &

> /dev/null 2>&1:这条命令将标准输出和标准错误都重定向到/dev/null,这意味着它们不会输出到控制台或任何文件。这样做是因为我们希望所有日志都由Logback处理并写入到配置文件中指定的日志文件里。

然而,如果你想要保留控制台输出(例如,对于调试目的),你可以省略这部分重定向,让Logback同时处理日志输出:

nohup java -jar your-application.jar &

【2】三个脚本

为了创建启动、重启和停止脚本,我们可以编写简单的Shell脚本来管理你的Java应用程序(study-0.0.1-SNAPSHOT.jar),并确保它在指定端口(8080)上运行。以下是每个脚本的示例代码。

启动脚本 start.sh

#!/bin/bash

# 应用程序名称
APP_NAME="study-0.0.1-SNAPSHOT.jar"

# 检查应用是否已经在运行
if pgrep -f "$APP_NAME" > /dev/null; then
  echo "$APP_NAME is already running."
else
  # 使用nohup启动应用,并将日志输出到nohup.out
  nohup java -jar $APP_NAME --server.port=8080 > /dev/null 2>&1 &
  echo "$APP_NAME started."
fi

停止脚本 stop.sh

#!/bin/bash

# 应用程序名称
APP_NAME="study-0.0.1-SNAPSHOT.jar"

# 查找并终止应用进程
PIDS=$(pgrep -f "$APP_NAME")
if [ -z "$PIDS" ]; then
  echo "$APP_NAME is not running."
else
  kill $PIDS
  echo "Stopped $APP_NAME (PID(s): $PIDS)."
fi

重启脚本 restart.sh

#!/bin/bash

# 调用停止脚本
./stop.sh

# 等待几秒钟以确保应用完全停止
sleep 5

# 调用启动脚本
./start.sh

注意事项

  1. 权限:确保脚本具有可执行权限。你可以通过以下命令为所有脚本添加执行权限:

    chmod +x start.sh stop.sh restart.sh
    
  2. 路径:确保脚本与你的JAR文件位于同一目录下,或者在脚本中使用绝对路径来引用JAR文件。

  3. 日志重定向:在start.sh脚本中,我们使用了nohup命令并将标准输出和错误重定向到nohup.out。如果需要自定义日志文件名或位置,可以修改这部分配置。

  4. 检查应用状态pgrep -f "$APP_NAME"用于查找正在运行的应用实例。这种方式依赖于应用名称的唯一性,如果存在多个同名应用,可能需要更精确的方法来识别目标进程。

运行脚本

  • 启动应用:

    ./start.sh
    
  • 停止应用:

    ./stop.sh
    
  • 重启应用:

    ./restart.sh
    

【3】优化后的 restart.sh

为了优化重启脚本,使其不依赖于start.shstop.sh,我们可以直接在restart.sh中实现停止和启动逻辑。这样做不仅可以减少对外部脚本的依赖,还能使整个流程更加简洁高效。

#!/bin/bash

# 应用程序名称
APP_NAME="study-0.0.1-SNAPSHOT.jar"
PORT=8080

# 函数:检查应用是否正在运行
is_running() {
    pgrep -f "$APP_NAME" > /dev/null 2>&1
}

# 停止应用
stop_app() {
    if is_running; then
        echo "Stopping $APP_NAME..."
        PIDS=$(pgrep -f "$APP_NAME")
        kill $PIDS
        # 等待几秒钟确保进程已完全停止
        for i in {1..10}; do
            if ! is_running; then
                echo "$APP_NAME stopped."
                return 0
            fi
            sleep 1
        done
        echo "Failed to stop $APP_NAME gracefully, forcing termination."
        kill -9 $PIDS
    else
        echo "$APP_NAME is not running."
    fi
}

# 启动应用
start_app() {
    if is_running; then
        echo "$APP_NAME is already running."
    else
        echo "Starting $APP_NAME..."
        nohup java -jar $APP_NAME --server.port=$PORT > /dev/null 2>&1 &
        # 确认应用是否成功启动
        for i in {1..10}; do
            if is_running; then
                echo "$APP_NAME started successfully."
                return 0
            fi
            sleep 1
        done
        echo "Failed to start $APP_NAME."
        exit 1
    fi
}

# 主逻辑
echo "Restarting $APP_NAME..."
stop_app
start_app

脚本解释

  1. is_running函数:用于检查应用程序是否正在运行。它使用pgrep命令查找与应用名称匹配的进程。

  2. stop_app函数

    • 首先检查应用是否正在运行。
    • 如果是,则发送终止信号给进程,并等待几秒钟以确保应用已经完全停止。
    • 如果应用没有在规定时间内停止,则强制终止(通过发送kill -9信号)。
  3. start_app函数

    • 检查应用是否已经在运行。
    • 如果没有运行,则使用nohup命令启动应用,并将输出重定向到nohup.out
    • 等待几秒钟以确认应用是否成功启动。
  4. 主逻辑部分:调用stop_app函数停止应用,然后调用start_app函数启动应用。

使用方法

  • 直接运行restart.sh脚本来重启你的Java应用:
    ./restart.sh
    

注意事项

  • 权限:确保脚本具有可执行权限。可以通过以下命令添加执行权限:

    chmod +x restart.sh
    
  • 路径:确保脚本与JAR文件位于同一目录下,或者在脚本中使用绝对路径引用JAR文件。

  • 日志管理:当前的日志被重定向到了nohup.out。如果需要更复杂的日志管理策略(如按日期分割日志),可以考虑使用Logrotate或其他工具。

通过这种方式,你可以简化脚本的管理和维护,同时确保重启过程可靠且易于控制。