编写脚本在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或其他工具。

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

相关推荐
源码方舟1 小时前
SpringBoot + Shiro + JWT 实现认证与授权完整方案实现
java·spring boot·后端
持之以恒的天秤1 小时前
线程同步学习
linux·学习
热河暖男5 小时前
【实战解决方案】Spring Boot+Redisson构建高并发Excel导出服务,彻底解决系统阻塞难题
spring boot·后端·excel
qq_339282236 小时前
centos中libc.so.6No such file的解决方式
linux·运维·centos
leoufung6 小时前
ECPF 简介
linux·网络·kernel
在肯德基吃麻辣烫7 小时前
Netdata在Ubuntu环境下的安装与配置:构建实时系统监控与性能分析平台
linux·运维·ubuntu
0吉光片羽08 小时前
【SpringBoot】集成kafka之生产者、消费者、幂等性处理和消息积压
spring boot·kafka·linq
Ryan-Joee8 小时前
Spring Boot三层架构设计模式
java·spring boot
愚戏师8 小时前
Linux复习笔记(六)shell编程
linux·笔记·shell
工一木子9 小时前
【Java项目脚手架系列】第七篇:Spring Boot + Redis项目脚手架
java·spring boot·redis