Files
gao 423b9ab55e STDIN
1 fix: 修复Vue模板语法错误和优化项目配置
   2
   3 - 修复MainDashboard.vue中多余的template结束标签导致的Vue编译错误
   4 - 更新项目文档QWEN.md,完善项目说明和部署指南
   5 - 优化create_admin.py脚本,从main.py导入统一配置
   6 - 增强PDF解析器错误处理和兼容性
   7 - 改进登录页面UI设计和用户体验
   8
   9 🤖 Generated with [Claude Code](https://claude.com/claude-code)
  10
  11 Co-Authored-By: Claude <[email protected]>
2025-11-02 22:44:18 +08:00

230 lines
7.8 KiB
Bash
Executable File

#!/bin/bash
# 统一停止脚本 - 一键停止前后端应用(优化版)
# 作者: Qwen Assistant
# 功能: 安全停止前后端应用,清理进程和临时文件
set -e # 遇到错误立即退出
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 打印带颜色的消息
print_message() {
local color=$1
local message=$2
echo -e "${color}${message}${NC}"
}
# 日志记录函数
log_message() {
local level=$1
local message=$2
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$timestamp] [$level] $message" | tee -a "stop.log"
}
print_message $BLUE "🛑 开始停止 WordMaster Pro 系统..."
# 记录停止过程
log_message "INFO" "开始停止 WordMaster Pro 系统"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"
# 检查是否有进程文件
has_process_files=false
if [ -f ".backend.pid" ] || [ -f ".frontend.pid" ]; then
has_process_files=true
fi
if [ "$has_process_files" = false ]; then
print_message $YELLOW "⚠️ 未找到进程ID文件,系统可能未运行"
log_message "WARNING" "未找到进程ID文件"
# 尝试通过端口查找进程
if lsof -i :8888 > /dev/null 2>&1 || lsof -i :3000 > /dev/null 2>&1; then
print_message $YELLOW "🔍 检测到可能的运行进程,尝试查找并停止..."
BACKEND_PID=$(lsof -ti:8888 2>/dev/null)
FRONTEND_PID=$(lsof -ti:3000 2>/dev/null)
if [ ! -z "$BACKEND_PID" ]; then
print_message $YELLOW "📡 发现后端进程 (PID: $BACKEND_PID),正在停止..."
kill $BACKEND_PID 2>/dev/null || true
sleep 1
if kill -0 $BACKEND_PID 2>/dev/null; then
kill -9 $BACKEND_PID 2>/dev/null || true
fi
print_message $GREEN "✅ 后端进程已停止"
fi
if [ ! -z "$FRONTEND_PID" ]; then
print_message $YELLOW "🎨 发现前端进程 (PID: $FRONTEND_PID),正在停止..."
kill $FRONTEND_PID 2>/dev/null || true
sleep 1
if kill -0 $FRONTEND_PID 2>/dev/null; then
kill -9 $FRONTEND_PID 2>/dev/null || true
fi
print_message $GREEN "✅ 前端进程已停止"
fi
else
print_message $GREEN "ℹ️ 系统未运行或已停止"
log_message "INFO" "系统未运行或已停止"
fi
# 清理进程文件
rm -f .backend.pid .frontend.pid
exit 0
fi
# 停止后端
if [ -f ".backend.pid" ]; then
BACKEND_PID=$(cat .backend.pid)
if [ ! -z "$BACKEND_PID" ] && ps -p $BACKEND_PID > /dev/null 2>&1; then
print_message $YELLOW "📡 正在停止后端服务 (PID: $BACKEND_PID)..."
log_message "INFO" "停止后端服务 (PID: $BACKEND_PID)"
# 发送SIGTERM信号,给进程优雅退出的机会
kill -TERM $BACKEND_PID 2>/dev/null || true
sleep 3
# 检查进程是否仍然存在
if ps -p $BACKEND_PID > /dev/null 2>&1; then
print_message $YELLOW "⏳ 后端进程仍在运行,等待更多时间..."
sleep 5
# 再次检查
if ps -p $BACKEND_PID > /dev/null 2>&1; then
print_message $YELLOW "⏳ 后端进程仍未退出,强制终止..."
kill -9 $BACKEND_PID 2>/dev/null || true
fi
fi
# 确认进程已终止
if ! ps -p $BACKEND_PID > /dev/null 2>&1; then
print_message $GREEN "✅ 后端服务已停止"
log_message "INFO" "后端服务已停止"
else
print_message $RED "❌ 无法停止后端进程 $BACKEND_PID"
log_message "ERROR" "无法停止后端进程 $BACKEND_PID"
fi
else
print_message $YELLOW "⚠️ 后端进程 $BACKEND_PID 不存在或已终止"
log_message "WARNING" "后端进程 $BACKEND_PID 不存在"
fi
# 清理后端进程文件
rm -f .backend.pid
else
print_message $YELLOW "⚠️ 未找到后端进程ID文件"
log_message "WARNING" "未找到后端进程ID文件"
fi
# 停止前端
if [ -f ".frontend.pid" ]; then
FRONTEND_PID=$(cat .frontend.pid)
if [ ! -z "$FRONTEND_PID" ] && ps -p $FRONTEND_PID > /dev/null 2>&1; then
print_message $YELLOW "🎨 正在停止前端服务 (PID: $FRONTEND_PID)..."
log_message "INFO" "停止前端服务 (PID: $FRONTEND_PID)"
# 发送SIGTERM信号,给进程优雅退出的机会
kill -TERM $FRONTEND_PID 2>/dev/null || true
sleep 2
# 检查进程是否仍然存在
if ps -p $FRONTEND_PID > /dev/null 2>&1; then
print_message $YELLOW "⏳ 前端进程仍在运行,等待更多时间..."
sleep 3
# 再次检查
if ps -p $FRONTEND_PID > /dev/null 2>&1; then
print_message $YELLOW "⏳ 前端进程仍未退出,强制终止..."
kill -9 $FRONTEND_PID 2>/dev/null || true
fi
fi
# 确认进程已终止
if ! ps -p $FRONTEND_PID > /dev/null 2>&1; then
print_message $GREEN "✅ 前端服务已停止"
log_message "INFO" "前端服务已停止"
else
print_message $RED "❌ 无法停止前端进程 $FRONTEND_PID"
log_message "ERROR" "无法停止前端进程 $FRONTEND_PID"
fi
else
print_message $YELLOW "⚠️ 前端进程 $FRONTEND_PID 不存在或已终止"
log_message "WARNING" "前端进程 $FRONTEND_PID 不存在"
fi
# 清理前端进程文件
rm -f .frontend.pid
else
print_message $YELLOW "⚠️ 未找到前端进程ID文件"
log_message "WARNING" "未找到前端进程ID文件"
fi
# 额外清理:尝试停止任何可能的 uvicorn 或 vite 进程
print_message $BLUE "🧹 清理可能残留的进程..."
ALL_UVICORN_PIDS=$(pgrep -f "uvicorn.*main:app" 2>/dev/null)
ALL_VITE_PIDS=$(pgrep -f "vite" 2>/dev/null)
if [ ! -z "$ALL_UVICORN_PIDS" ]; then
print_message $YELLOW "🔍 发现可能的 uvicorn 进程: $ALL_UVICORN_PIDS"
for pid in $ALL_UVICORN_PIDS; do
if [ "$pid" != "$BACKEND_PID" ]; then # 避免重复停止
kill -TERM $pid 2>/dev/null || true
sleep 1
if kill -0 $pid 2>/dev/null; then
kill -9 $pid 2>/dev/null || true
fi
fi
done
print_message $GREEN "✅ uvicorn 进程已清理"
fi
if [ ! -z "$ALL_VITE_PIDS" ]; then
print_message $YELLOW "🔍 发现可能的 vite 进程: $ALL_VITE_PIDS"
for pid in $ALL_VITE_PIDS; do
if [ "$pid" != "$FRONTEND_PID" ]; then # 避免重复停止
kill -TERM $pid 2>/dev/null || true
sleep 1
if kill -0 $pid 2>/dev/null; then
kill -9 $pid 2>/dev/null || true
fi
fi
done
print_message $GREEN "✅ vite 进程已清理"
fi
# 清理临时文件
print_message $BLUE "🧹 清理临时文件..."
if [ -d "backend/__pycache__" ]; then
rm -rf backend/__pycache__ 2>/dev/null || true
fi
if [ -d "backend/venv/lib/python*/__pycache__" ]; then
rm -rf backend/venv/lib/python*/__pycache__ 2>/dev/null || true
fi
print_message $GREEN "✅ 临时文件已清理"
# 显示清理完成信息
print_message $GREEN ""
print_message $GREEN "🎉 WordMaster Pro 系统已完全停止!"
print_message $GREEN ""
print_message $BLUE "📋 清理完成项目:"
print_message $GREEN "✅ 后端服务已停止"
print_message $GREEN "✅ 前端服务已停止"
print_message $GREEN "✅ 进程ID文件已清理"
print_message $GREEN "✅ 可能的残留进程已清理"
print_message $GREEN "✅ 临时文件已清理"
echo ""
print_message $BLUE "📁 日志记录: $(pwd)/stop.log"
log_message "INFO" "WordMaster Pro 系统停止完成"