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