Skip to content

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

1-13.png

bash
# 排除自己
ps -ef | grep xx-springboot | grep -v color=auto
bash
# 停止服务
kill -9 进程id

3、启动项目脚本 - 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 3

5、检查服务脚本

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."
fi

6、赋予权限

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.sh

7、脚本解释

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