09、项目启动优化
1、项目后台启动
前台启动,退出服务就停止了
bash
nohup java -jar xx-springboot-1.0-SNAPSHOT.jar > stdout.log 2>&1 &提示
- 2 表示标准错误输出的文件描述符,通常用于捕获程序的错误消息和异常。
>是标准输出重定向操作符,用于将命令的标准输出写入到指定文件(在这里是 stdout.log)。- & 表示将一个文件描述符和另一个文件描述符关联起来。
- 1 表示标准输出的文件描述符。
2、停止服务
bash
ps -ef | grep xx-springboot
bash
# 排除自己
ps -ef | grep xx-springboot | grep -v color=autobash
# 停止服务
kill -9 进程id3、启动项目脚本 - start.sh
bash
#!/bin/bash
SERVCER_JAR=$(find . -name "*.jar" | head -n 1)
# 在当前目录及其子目录中查找第一个 .jar 文件,并将其路径赋值给 SERVCER_JAR 变量
DEPLOY_DIR=`pwd`
# 获取当前工作目录的绝对路径,并赋值给 DEPLOY_DIR 变量
STDOUT_FILE=$DEPLOY_DIR/stdout.log
# 定义标准输出日志文件的路径,位于当前目录下的 stdout.log 文件
PID=$(ps aux | grep java | grep "$SERVCER_JAR" | grep -v color=auto | awk '{print $2}')
# 查找正在运行的 Java 进程,匹配 SERVCER_JAR 文件名,并提取进程 ID (PID)
if [ -z "$PID" ]; then
# 检查 PID 是否为空(即服务是否未运行)
echo -e "\033[31mhe $SERVCER_JAR not started!开始启动... \033[0m "
# 输出红色提示信息:服务未启动,开始启动
else
echo -e "echo -e "\033[31m $SERVCER_JAR 已经启动 开始关闭 并重启\033[0m""
# 输出红色提示信息:服务已启动,准备关闭并重启
echo -e "\033[32mhe Stopping the service $SERVCER_JAR ... \033[0m"
# 输出绿色提示信息:正在停止服务
kill -9 $PID > /dev/null 2>&1
# 强制终止进程(kill -9),并将输出重定向到 /dev/null(不显示)
echo -e "OK!"
# 输出提示信息:停止成功
echo -e "PID: $PID"
# 输出被终止的进程 ID
fi
echo -e "\033[32mhe start the service $SERVCER_JAR \033[0m "
# 输出绿色提示信息:正在启动服务
nohup java -jar $SERVCER_JAR > $STDOUT_FILE 2>&1 &
# 使用 nohup 启动 Java 服务,并将标准输出和错误输出重定向到 stdout.log 文件
# & 表示在后台运行
tail -f $DEPLOY_DIR/stdout.log
# 实时查看 stdout.log 文件的输出内容(用于监控服务启动日志)脚本功能总结
- 查找 JAR 文件:自动定位当前目录下的第一个 .jar 文件。
- 检查服务状态:通过进程 ID 判断服务是否正在运行。
- 停止服务:如果服务已运行,则强制终止。
- 启动服务:使用 nohup 在后台启动 Java 服务,并将日志输出到 stdout.log 。
- 监控日志:实时显示日志内容,方便调试。
4、停止项目脚本 stop.sh
bash
#!/bin/bash
export PATH=$JAVA_HOME/bin:$PATH
cd `dirname $0`
BIN_DIR=`pwd`
DEPLOY_DIR=`pwd`
SERVCER_JAR=$(find . -name "*.jar" | head -n 1)
DEPLOY_DIR=`pwd`
CONF_DIR=$DEPLOY_DIR
PIDS=`ps -ef | grep java | grep "$SERVCER_JAR" | grep -v color=auto |awk '{print $2}'`
if [ -z "$PIDS" ]; then
echo "ERROR: The $SERVCER_JAR does not started!"
exit 1
fi
echo -e "Stopping the service $SERVCER_JAR ...\c"
for PID in $PIDS ; do
kill -9 $PID > /dev/null 2>&1
done
COUNT=0
while [ $COUNT -lt 1 ]; do
echo -e ".\c"
sleep 1
COUNT=1
for PID in $PIDS ; do
PID_EXIST=`ps -f -p $PID | grep java`
if [ -n "$PID_EXIST" ]; then
COUNT=0
break
fi
done
done
sleep 35、检查服务脚本
bash
#!/bin/bash
SERVCER_JAR=$(find . -name "*.jar" | head -n 1)
# 使用ps命令查找Java进程并筛选特定的JAR文件
PID=$(ps aux | grep java | grep "$SERVCER_JAR" | grep -v grep | awk '{print $2}')
# 检查PID是否为空
if [ -z "$PID" ]; then
echo "The $SERVCER_JAR is not started."
else
echo "The $SERVCER_JAR is started with PID: $PID."
fi6、赋予权限
bash
[root@xx-blog xx-springboot]# ls
check.sh start.sh stdout.log stop.sh xx-springboot-1.0-SNAPSHOT.jar
[root@xx-blog xx-springboot]# chmod 777 start.sh stop.sh check.sh7、脚本解释
1、启动脚本
bash
#!/bin/bash
# 查找第一个 jar 包
SERVCER_JAR=$(find . -name "*.jar" | head -n 1)
# 当前部署目录
DEPLOY_DIR=$(pwd)
# 日志输出文件
STDOUT_FILE=$DEPLOY_DIR/stdout.log
# 获取运行中的进程 PID
PID=$(ps aux | grep java | grep "$SERVCER_JAR" | grep -v grep | awk '{print $2}')
# 判断是否已运行
if [ -z "$PID" ]; then
echo -e "\033[31m $SERVCER_JAR 未启动,开始启动... \033[0m"
else
echo -e "\033[31m $SERVCER_JAR 已经启动,准备重启... \033[0m"
echo -e "\033[32m 正在停止服务... PID: $PID \033[0m"
kill -9 $PID > /dev/null 2>&1
echo -e "\033[32m 服务已停止 \033[0m"
fi
# 启动服务
echo -e "\033[32m 正在启动服务 $SERVCER_JAR \033[0m"
nohup java -jar "$SERVCER_JAR" > "$STDOUT_FILE" 2>&1 &
# 查看启动日志
tail -f "$STDOUT_FILE"2、停止脚本
bash
#!/bin/bash
# 设置 JAVA 执行路径(要求 $JAVA_HOME 已配置)
export PATH=$JAVA_HOME/bin:$PATH
# 切换到脚本所在目录
cd `dirname $0`
# 当前目录作为 bin 和部署目录
BIN_DIR=`pwd`
DEPLOY_DIR=`pwd`
# 查找当前目录及子目录下的第一个 .jar 文件(假设只有一个需要启动的服务)
SERVCER_JAR=$(find . -name "*.jar" | head -n 1)
# 配置目录设为当前目录(你可以按需更改)
CONF_DIR=$DEPLOY_DIR
# 获取当前运行的该 JAR 包的 Java 进程 PID(排除 grep 自身)
PIDS=`ps -ef | grep java | grep "$SERVCER_JAR" | grep -v color=auto | awk '{print $2}'`
# 如果没有找到进程,则打印错误并退出
if [ -z "$PIDS" ]; then
echo "ERROR: The $SERVCER_JAR does not started!"
exit 1
fi
# 打印停止服务提示
echo -e "Stopping the service $SERVCER_JAR ...\c"
# 杀掉所有相关进程
for PID in $PIDS ; do
kill -9 $PID > /dev/null 2>&1
done
# 检查进程是否完全停止
COUNT=0
while [ $COUNT -lt 1 ]; do
echo -e ".\c"
sleep 1
COUNT=1
for PID in $PIDS ; do
PID_EXIST=`ps -f -p $PID | grep java`
if [ -n "$PID_EXIST" ]; then
COUNT=0
break
fi
done
done
# 等待 3 秒确保完全退出
sleep 3