关于在Linux中部署jar包

lin 1767 字 93 次阅读


一、如何后台执行jar包

执行jar包的命令和在windows操作系统上是一样

java -jar jarName-0.0.1-SNAPSHOT.jar

但这样会导致该命令行被占用,可以将jar程序设置成后台运行,并且将标准输出的日志重定向至文件msg.log

nohup java -jar jarName-0.0.1-SNAPSHOT.jar >msg.log 2>&1 &;

nohup命令运行由Command参数和任何相关的Arg参数指定的命令,忽略所有挂断(SIGHUP)信号。
在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup命令,添加 &(表示“and”的符号)到命令的尾部。

  • &:指在后台运行,但当用户推出(挂起)的时候,命令自动也跟着退出
  • nohup:不挂断的运行,注意并没有后台运行的功能,,就是指,用nohup运行命令可以使命令永久的执行下去,和用户终端没有关系,
  • 例如我们断开SSH连接都不会影响他的运行,注意了nohup没有后台运行的意思;&才是后台运行。

二、关于自动化脚本启动和关闭Java程序

1.启动脚本

一个简单的启动脚本示例,它会拿到当前文件夹下的jar包并执行

#!/bin/bash

#拿到全部的jar包文件
JAR_FILES=($(find . -maxdepth 1 -type f -name "*.jar"))
#设置配置文件路径
CONFIG_DIR="config/application.yml"

#检查是否存在
if [ ${#JAR_FILES[@]} -eq 0 ]; then
    echo "当前文件夹下不存在jar包"
    exit 1
fi

if [ ${#JAR_FILES[@]} -eq 1 ]; then
    JAR_FILE=${JAR_FILES[0]}
else
    echo "所有jar包:"
    echo "========================================"
    COUNT=1
    for FILE in "${JAR_FILES[@]}"; do
        BASENAME=$(basename "$FILE")
        echo "$COUNT: $BASENAME"
        COUNT=$((COUNT + 1))
    done
    echo "========================================"
    echo "请输入你要选择的jar包序号:"
    read -p "> " SELECTED_INDEX
   
    if ! [[ "$SELECTED_INDEX" =~ ^[0-9]+$ ]]; then
        echo "错误:请输入数字..."
        exit 1
    fi
   
    INDEX=$((SELECTED_INDEX - 1))
   
    if [ $INDEX -lt 0 ] || [ $INDEX -ge ${#JAR_FILES[@]} ]; then
        echo "错误:超出列表索引..."
        exit 1
    fi
   
    JAR_FILE=${JAR_FILES[$INDEX]}
fi

echo "本次选择文件:$JAR_FILE"

JAR_PATH="$JAR_FILE"
JAR_NAME=$(basename "$JAR_FILE")
APP_PID=$(pgrep -f "$JAR_NAME")

if [ ! -z "$APP_PID" ]; then
    kill $APP_PID
    echo "Jar包 '$JAR_NAME' , PID: '$APP_PID' 已在运行,先进行停止.."
fi

#检查jar包文件是否存在
if [ ! -f "$JAR_PATH" ]; then
    echo "指定的Jar包 '$JAR_FILE' 文件不存在,请确保脚本和Jar包在同一目录,并输入了正确的文件名."
    exit 1
fi

#检查配置文件是否存在
if [ ! -f "$CONFIG_DIR" ]; then
    nohup java -jar "$JAR_PATH" > app.log 2>&1 &
    echo "Jar包 '$JAR_FILE' 已启动,使用默认配置文件,日志输出到 app.log 文件中..."
else
    nohup java -jar "$JAR_PATH" --spring.config.location="file:$CONFIG_DIR" > app.log 2>&1 &
    echo "Jar包 '$JAR_FILE' 已启动,使用外置配置文件 '$CONFIG_DIR',日志输出到 app.log 文件中.."
fi

下面是进阶版,可以依次启动指定文件夹下的jar包

#!/bin/bash
#拿到全部的jar包文件,定义目标文件开始位置
CURRENT_PATH="./web"
CURRENT_PATH_TWO="./server"
CURRENT_PATH_THREE="./front"
#BACK="true"

function doMain() {
    cd $CURRENT_PATH
    #JAR_FILES=($(find $CURRENT_PATH -maxdepth 1 -type f -name "*.jar"))
    JAR_FILES=($(find . -maxdepth 1 -type f -name "*.jar"))
    #设置配置文件路径
    #CONFIG_DIR="$CURRENT_PATH/config/application.yml"
    CONFIG_DIR="./config/application.yml"
   
    #检查是否存在
    if [ ${#JAR_FILES[@]} -eq 0 ]; then
        echo "当前文件夹下不存在jar包"
        return 1
    fi
   
    if [ ${#JAR_FILES[@]} -eq 1 ]; then
        JAR_FILE=${JAR_FILES[0]}
    else
        echo "所有jar包:"
        echo "========================================"
        COUNT=1
        for FILE in "${JAR_FILES[@]}"; do
            BASENAME=$(basename "$FILE")
            echo "$COUNT: $BASENAME"
            COUNT=$((COUNT + 1))
        done
        echo "========================================"
        echo "请输入你要选择的jar包序号:"
        read -p "> " SELECTED_INDEX
       
        if ! [[ "$SELECTED_INDEX" =~ ^[0-9]+$ ]]; then
            echo "错误:请输入数字..."
            return 1
        fi
       
        INDEX=$((SELECTED_INDEX - 1))
       
        if [ $INDEX -lt 0 ] || [ $INDEX -ge ${#JAR_FILES[@]} ]; then
            echo "错误:超出列表索引..."
            return 1
        fi
       
        JAR_FILE=${JAR_FILES[$INDEX]}
    fi
   
    echo "本次选择文件:$JAR_FILE"
   
    JAR_PATH="$JAR_FILE"
    JAR_NAME=$(basename "$JAR_FILE")
    APP_PID=$(pgrep -f "$JAR_NAME")
   
    if [ ! -z "$APP_PID" ]; then
        kill $APP_PID
        echo "Jar包 '$JAR_NAME' , PID: '$APP_PID' 已在运行,先进行停止.."
    fi
   
    if [ ! -f "$JAR_PATH" ]; then
        echo "指定的Jar包 '$JAR_FILE' 文件不存在,请确保脚本和Jar包在同一目录,并输入了正确的文件名..."
        return 1
    fi
   
    #检查配置文件是否存在
    if [ ! -f "$CONFIG_DIR" ]; then
        # nohup java -jar "$JAR_PATH" > $CURRENT_PATH/app.log &
        nohup java -jar "$JAR_PATH" > ./app.log 2>&1 &
        echo "Jar包 '$JAR_FILE' 已启动,使用默认配置文件,日志输出到 app.log 文件中..."
    else
        # nohup java -jar "$JAR_PATH" --spring.config.location="file:$CONFIG_DIR" > $CURRENT_PATH/app.log &
        nohup java -jar "$JAR_PATH" --spring.config.location="file:$CONFIG_DIR" > ./app.log 2>&1 &
        echo "Jar包 '$JAR_FILE' 已启动,使用外置配置文件 '$CONFIG_DIR',日志输出到 app.log 文件中.."
    fi
}

#第一次执行
doMain

#进行替换参数,执行第二次
cd ../
CURRENT_PATH=$CURRENT_PATH_TWO
echo "休眠10秒,等待第一次程序正常启动"
sleep 10
doMain

#进行替换参数,执行第三次
cd ../
CURRENT_PATH=$CURRENT_PATH_THREE
echo "休眠10秒,等待第二次程序正常启动"
sleep 10
doMain

2.关闭脚本

同上,一个简单的关闭程序的脚本

#!/bin/bash
# 拿到全部的jar包文件
JAR_FILES=($(find . -maxdepth 1 -type f -name "*.jar"))

# 检查是否存在
if [ ${#JAR_FILES[@]} -eq 0 ]; then
    echo "当前文件夹下不存在jar包!"
    exit 1
fi

if [ ${#JAR_FILES[@]} -eq 1 ]; then
    JAR_FILE=${JAR_FILES[0]}
else
    echo "所有jar包:"
    echo "========================================"
    COUNT=1
    for FILE in "${JAR_FILES[@]}"; do
        BASENAME=$(basename "$FILE")
        echo "$COUNT: $BASENAME"
        ((COUNT++))
    done
    echo "========================================"
    echo "请输入你要选择的jar包序号:"
    read -p "> " SELECTED_INDEX
   
    if ! [[ "$SELECTED_INDEX" =~ ^[0-9]+$ ]]; then
        echo "错误:请输入数字。"
        exit 1
    fi
   
    INDEX=$((SELECTED_INDEX - 1))
   
    if [ $INDEX -lt 0 ] || [ $INDEX -ge ${#JAR_FILES[@]} ]; then
        echo "错误:超出列表索引范围。"
        exit 1
    fi
   
    JAR_FILE=${JAR_FILES[$INDEX]}
fi

echo "本次选择文件:$JAR_FILE"

JAR_NAME=$(basename "$JAR_FILE")
APP_PID=$(pgrep -f "$JAR_NAME")

if [ -z "$APP_PID" ]; then
    echo "Jar包 '$JAR_NAME' 并没有运行..."
else
    kill $APP_PID
    echo "Jar包 '$JAR_NAME' , PID: '$APP_PID' 停止操作成功..."
fi

进阶版

#!/bin/bash

CURRENT_PATH="./web"
CURRENT_PATH_TWO="./server"
CURRENT_PATH_THREE="./front"
#BACK="true"

function doMain() {
    cd $CURRENT_PATH
    #拿到全部的jar包文件
    JAR_FILES=($(find . -maxdepth 1 -type f -name "*.jar"))
   
    #检查是否存在
    if [ ${#JAR_FILES[@]} -eq 0 ]; then
        echo "当前文件夹下不存在jar包"
        return 1
    fi
   
    if [ ${#JAR_FILES[@]} -eq 1 ]; then
        JAR_FILE=${JAR_FILES[0]}
    else
        echo "所有jar包:"
        echo "========================================"
        COUNT=1
        for FILE in "${JAR_FILES[@]}"; do
            BASENAME=$(basename "$FILE")
            echo "$COUNT: $BASENAME"
            COUNT=$((COUNT + 1))
        done
        echo "========================================"
        echo "请输入你要选择的jar包序号:"
        read SELECTED_INDEX
       
        if ! [[ "$SELECTED_INDEX" =~ ^[0-9]+$ ]]; then
            echo "错误:请输入数字..."
            return 1
        fi
       
        INDEX=$((SELECTED_INDEX - 1))
       
        if [ $INDEX -lt 0 ] || [ $INDEX -ge ${#JAR_FILES[@]} ]; then
            echo "错误:超出列表索引..."
            return 1
        fi
       
        JAR_FILE=${JAR_FILES[$INDEX]}
    fi
   
    echo "本次选择文件:$JAR_FILE"
   
    JAR_NAME=$(basename "$JAR_FILE")
    APP_PID=$(pgrep -f "$JAR_NAME")
   
    if [ -z "$APP_PID" ]; then
        echo "Jar包 '$JAR_NAME' 并没有运行..."
    else
        kill -9 $APP_PID
        echo "Jar包 '$JAR_NAME' , PID: '$APP_PID' 停止操作成功..."
    fi
}

#第一次执行
doMain

#替换参数,第二次执行
cd ../
CURRENT_PATH=$CURRENT_PATH_TWO
doMain

#替换参数,第三次执行
cd ../
CURRENT_PATH=$CURRENT_PATH_THREE
doMain
天下繁华,唯有一心
最后更新于 2025-11-25