当前位置: 首页 > news >正文

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

【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或其他工具。

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

相关文章:

  • 强大的AI网站推荐(第一集)—— Devv AI
  • 串口部分问题
  • 21、web前端开发之html5(二)
  • Deepseek+飞书实现简历分析建议+面试题
  • Android 13深度定制:SystemUI状态栏时间居中显示终极实战指南
  • Day37 | 739. 每日温度、496. 下一个更大元素 I、503. 下一个更大元素 II、42. 接雨水、84. 柱状图中最大的矩形
  • PH热榜 | 2025-03-19
  • Windows10抓包工具Wireshark下载、安装、使用
  • Java基础面试题学习
  • selenium(鼠标操作、页面操作、用例设计)
  • BYU-YOLO数据格式准备
  • 群体智能优化算法-灰狼优化算法(Grey Wolf Optimizer, GWO,含Matlab源代码)
  • 【时时三省】(C语言基础)习题:分析一个程序
  • 深入理解traceroute命令及其原理
  • 药房链路轨道“空间拓扑优化+动态算法决策+多级容错控制”三重链式编程技术解析与应用
  • 大模型应用中如何保持实时性和多人对话一致性问题?
  • 蓝桥杯练习day2:拿硬币
  • Linux日志管理
  • 微分方程求解及推导过程
  • 华为欧拉 22.03 版本部署 nginx
  • 特朗普再提“接管”加沙,要将其变为“自由区”
  • 美F-35险被胡塞武装击中,损失增大让行动成“烂尾仗”
  • 共建医学人工智能高地,上海卫健委与徐汇区将在这些方面合作
  • 马上评|“为偶像正名”的正确做法是什么
  • 第78届戛纳电影节开幕,罗伯特·德尼罗领取终身成就奖
  • 哲学新书联合书单|远离苏格拉底