#!/bin/bash # 石河子后端 自动重启脚本 # VS Code 保存 → Java 扩展编译 → 本脚本检测变更 → 杀旧进程 → 起新进程 # 用法: bash watch.sh SRC_DIR="$(cd "$(dirname "$0")" && pwd)" cd "$SRC_DIR" APP_CLASS="com.ruoyi.RuoYiApplication" PORT=9091 echo "================================================" echo " SHZ Backend 自动重启模式" echo " 流程: 保存文件 → Java扩展编译 → 检测变更 → 重启服务" echo " 端口: $PORT" echo " 按 Ctrl+C 退出" echo "================================================" # 获取最新 .java 文件修改时间 get_latest_mtime() { find . -name "*.java" -path "*/src/*" -type f -printf '%T@\n' 2>/dev/null | sort -rn | head -1 | cut -d'.' -f1 } # 精准杀后端进程 kill_backend() { local pid=$(jps -l 2>/dev/null | grep "$APP_CLASS" | awk '{print $1}') if [ -n "$pid" ]; then echo "[$(date '+%H:%M:%S')] 🔪 终止旧进程 PID=$pid..." taskkill //PID "$pid" //F 2>/dev/null sleep 3 # 确认端口已释放 while netstat -ano 2>/dev/null | grep -q ":$PORT "; do sleep 2 echo "[$(date '+%H:%M:%S')] ⏳ 等待端口 $PORT 释放..." done fi } # 启动服务 start_server() { echo "[$(date '+%H:%M:%S')] 🚀 启动服务..." cd "$SRC_DIR" nohup mvn spring-boot:run -pl ruoyi-admin -DskipTests > /tmp/shz-backend.log 2>&1 & echo "[$(date '+%H:%M:%S')] 等待服务就绪..." for i in $(seq 1 90); do sleep 2 curl -s --max-time 2 "http://localhost:$PORT/" > /dev/null 2>&1 && \ echo "[$(date '+%H:%M:%S')] ✅ 服务已就绪: http://localhost:$PORT/" && \ return 0 done echo "[$(date '+%H:%M:%S')] ⚠️ 启动超时,查看 /tmp/shz-backend.log" } # --- 主流程 --- # 首次启动 kill_backend start_server last_ts=$(get_latest_mtime) while true; do sleep 3 current_ts=$(get_latest_mtime) if [ -n "$current_ts" ] && [ -n "$last_ts" ] && [ "$current_ts" -gt "$last_ts" ]; then echo "" echo "[$(date '+%H:%M:%S')] 📝 检测到 .java 文件变更,重启服务..." kill_backend start_server last_ts=$(get_latest_mtime) fi done