Skip to content

09、项目启动优化

1、项目后台启动

前台启动,退出服务就停止了

sh
nohup java -jar xx-springboot-1.0-SNAPSHOT.jar  > stdout.log 2>&1 &
  • 2 表示标准错误输出的文件描述符,通常用于捕获程序的错误消息和异常。
  • > 是标准输出重定向操作符,用于将命令的标准输出写入到指定文件(在这里是 stdout.log)。
  • & 表示将一个文件描述符和另一个文件描述符关联起来。
  • 1 表示标准输出的文件描述符。

2、停止服务

sh
ps -ef | grep xx-springboot

image-20250729093123057

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

3、启动项目脚本

sh
SERVCER_JAR=$(find . -name "*.jar" | head -n 1)
DEPLOY_DIR=`pwd`
STDOUT_FILE=$DEPLOY_DIR/stdout.log


PID=$(ps aux | grep java | grep "$SERVCER_JAR" | grep -v color=auto | awk '{print $2}')
if [ -z "$PID" ]; then
    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
    echo -e "OK!"
    echo -e "PID: $PID"
fi

echo -e "\033[32mhe start the service $SERVCER_JAR \033[0m "
nohup java -jar $SERVCER_JAR  > $STDOUT_FILE 2>&1 &
tail -f $DEPLOY_DIR/stdout.log

4、停止项目脚本

sh
#!/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、检查服务脚本

sh
#!/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、赋予权限

sh
[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、启动脚本

sh
#!/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、停止脚本

sh
#!/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