Files
2026-09-21 19:21:35 +08:00

141 lines
3.5 KiB
Bash

#!/bin/bash
# ./ry.sh start 启动 stop 停止 restart 重启 status 状态
AppName=ruoyi-admin.jar
export JAVA_HOME=/project/jdk-21.0.10
export PATH=$JAVA_HOME/bin:$PATH
# 自动检测 CPU 核数,选择 JVM 规格(可用 JVM_PROFILE 环境变量覆盖)
if [ -z "$JVM_PROFILE" ]; then
CPUS=$(nproc)
if [ "$CPUS" -le 16 ]; then
JVM_PROFILE="16c32g"
else
JVM_PROFILE="32c64g"
fi
fi
case "$JVM_PROFILE" in
16c32g)
HEAP_SIZE="10g"
GC_REGION="8m"
GC_PARALLEL="5"
GC_CONC="2"
;;
32c64g)
HEAP_SIZE="22g"
GC_REGION="16m"
GC_PARALLEL="10"
GC_CONC="3"
;;
*)
echo "ERROR: unknown JVM_PROFILE=$JVM_PROFILE (supported: 16c32g, 32c64g)"
exit 1
;;
esac
echo "JVM Profile: ${JVM_PROFILE} | Heap: ${HEAP_SIZE} | ParallelGCThreads=${GC_PARALLEL} ConcGCThreads=${GC_CONC}"
# Spring Profile(可用 SPRING_PROFILE 环境变量覆盖)
SPRING_PROFILE="${SPRING_PROFILE:-pro}"
# JVM参数
LOG_DIR=/www/ruoyi/logs
JVM_OPTS="-Dname=$AppName -Duser.timezone=Asia/Shanghai -Xms${HEAP_SIZE} -Xmx${HEAP_SIZE} -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:G1HeapRegionSize=${GC_REGION} -XX:ParallelGCThreads=${GC_PARALLEL} -XX:ConcGCThreads=${GC_CONC} -XX:InitiatingHeapOccupancyPercent=35 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${LOG_DIR}/ -Xlog:gc*=info:file=${LOG_DIR}/gc.log:time,uptime:filecount=10,filesize=50M"
if [ "$1" = "" ]; then
echo -e "\033[0;31m 未输入操作名 \033[0m \033[0;34m {start|stop|restart|status} \033[0m"
exit 1
fi
if [ "$AppName" = "" ]; then
echo -e "\033[0;31m 未输入应用名 \033[0m"
exit 1
fi
get_pid() {
ps -ef |grep java|grep $AppName|grep -v grep|awk '{print $2}'
}
start() {
PID=`get_pid`
if [ x"$PID" != x"" ]; then
echo "$AppName is running..."
exit 1
fi
mkdir -p $LOG_DIR
nohup java $JVM_OPTS -Dspring.profiles.active=$SPRING_PROFILE -jar $AppName > /dev/null 2>&1 &
sleep 3
PID=`get_pid`
if [ x"$PID" != x"" ]; then
echo "Start $AppName success..."
else
echo "ERROR: $AppName failed to start, check logs"
exit 1
fi
}
stop() {
echo "Stop $AppName"
PID=`get_pid`
if [ x"$PID" = x"" ]; then
echo "$AppName already stopped."
return
fi
TARGET_PID=$PID
kill -TERM $TARGET_PID
echo "$AppName (pid:$TARGET_PID) exiting..."
timeout=10
count=0
while kill -0 $TARGET_PID 2>/dev/null; do
count=$((count + 1))
if [ $count -gt $timeout ]; then
echo "$AppName graceful shutdown timed out after ${timeout}s, force killing..."
kill -9 $TARGET_PID 2>/dev/null || true
sleep 2
if kill -0 $TARGET_PID 2>/dev/null; then
echo "ERROR: $AppName still alive (pid:$TARGET_PID) after kill -9, abort."
exit 1
fi
echo "$AppName force killed."
return
fi
sleep 1
done
echo "$AppName exited."
}
restart() {
stop
start
}
status() {
PID=`ps -ef |grep java|grep $AppName|grep -v grep|wc -l`
if [ $PID != 0 ];then
echo "$AppName is running..."
else
echo "$AppName is not running..."
fi
}
case $1 in
start)
start;;
stop)
stop;;
restart)
restart;;
status)
status;;
*)
echo -e "\033[0;31m 未输入操作名 \033[0m \033[0;34m {start|stop|restart|status} \033[0m"
exit 1;;
esac