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

【1】启动命令

bash 复制代码
nohup java -jar your-application.jar > /dev/null 2>&1 &

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

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

bash 复制代码
nohup java -jar your-application.jar &

【2】三个脚本

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

启动脚本 start.sh

bash 复制代码
#!/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

bash 复制代码
#!/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

bash 复制代码
#!/bin/bash

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

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

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

注意事项

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

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

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

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

运行脚本

  • 启动应用:

    bash 复制代码
    ./start.sh
  • 停止应用:

    bash 复制代码
    ./stop.sh
  • 重启应用:

    bash 复制代码
    ./restart.sh

【3】优化后的 restart.sh

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

bash 复制代码
#!/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应用:

    bash 复制代码
    ./restart.sh

注意事项

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

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

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

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

相关推荐
守望时空3315 分钟前
RustDesk搭建指南
linux
C++ 老炮儿的技术栈19 分钟前
在 Scintilla 中为 Squirrel 语言设置语法解析器的方法
linux·运维·c++·git·ubuntu·github·visual studio
AI_Gump30 分钟前
【AI阅读】20250717阅读输入
java·spring boot·spring
白鹭1 小时前
基于LNMP架构的分布式个人博客搭建
linux·运维·服务器·网络·分布式·apache
java叶新东老师1 小时前
linux 部署 flink 1.15.1 并提交作业
linux·运维·flink
程序员JerrySUN2 小时前
Linux系统架构核心全景详解
linux·运维·系统架构
无敌的牛2 小时前
Linux文件理解,基础IO理解
linux·运维·服务器
未来之窗软件服务2 小时前
跨平台 WebSocket 服务器的设计与实现 —— 基于.NET 8 的跨操作系统解决方案linux,macos,windows——开发工具
linux·服务器·websocket·仙盟创梦ide·东方仙盟
angushine2 小时前
logstash采集springboot微服务日志
spring boot·微服务·linq
杰哥的狗3 小时前
nacos连接失败,启动失败常见问题
linux·docker