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