一、如何后台执行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

Comments NOTHING