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

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

相关推荐
czhc114007566315 分钟前
LINUX99 centos8:网络 yum配置;shell:while [ $i -ne 5 ];do let i++ done
linux
会开花的二叉树2 小时前
彻底搞懂 Linux 基础 IO:从文件操作到缓冲区,打通底层逻辑
linux·服务器·c++·后端
爱吃烤鸡翅的酸菜鱼2 小时前
【Spring】原理解析:Spring Boot 自动配置
java·spring boot
呼啦啦5612 小时前
【Linux】权限
linux·权限
十八旬2 小时前
苍穹外卖项目实战(day7-1)-缓存菜品和缓存套餐功能-记录实战教程、问题的解决方法以及完整代码
java·数据库·spring boot·redis·缓存·spring cache
晨曦5432103 小时前
零基础12周精通Linux学习计划
linux
linux修理工3 小时前
n1 Armbian OS 24.11.0 noble 安装suricata
linux·运维·服务器
傅里叶3 小时前
sudo启动Flutter程序AMD初始化失败
linux·flutter
bug攻城狮3 小时前
CentOS 7 出现 “Could not resolve host“ 错误的修复方案
linux·运维·centos
feifeigo1233 小时前
CentOS系统管理:useradd命令的全面解析
linux·运维·centos