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]>
323 lines
12 KiB
Bash
Executable File
323 lines
12 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# 状态检查脚本 - 检查应用运行状态(优化版)
|
|
# 作者: Qwen Assistant
|
|
# 功能: 检查应用运行状态、系统资源使用情况、日志分析
|
|
|
|
# 颜色定义
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
PURPLE='\033[0;35m'
|
|
CYAN='\033[0;36m'
|
|
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 "status.log"
|
|
}
|
|
|
|
print_message $BLUE "🔍 WordMaster Pro 系统状态检查 (优化版)"
|
|
echo "=============================================="
|
|
|
|
# 记录状态检查
|
|
log_message "INFO" "开始系统状态检查"
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
cd "$SCRIPT_DIR"
|
|
|
|
# 加载环境变量
|
|
if [ -f ".env" ]; then
|
|
export $(grep -v '^#' .env | xargs)
|
|
BACKEND_PORT=${BACKEND_PORT:-8888}
|
|
FRONTEND_PORT=${FRONTEND_PORT:-3008}
|
|
else
|
|
BACKEND_PORT=8888
|
|
FRONTEND_PORT=3008
|
|
fi
|
|
|
|
# 显示系统信息
|
|
print_message $BLUE "🖥️ 系统信息:"
|
|
print_message $CYAN " 操作系统: $(uname -s)"
|
|
print_message $CYAN " 主机名: $(hostname)"
|
|
print_message $CYAN " 当前时间: $(date)"
|
|
echo ""
|
|
|
|
# 检查系统资源
|
|
print_message $BLUE "📊 系统资源状态:"
|
|
if command -v free &> /dev/null; then
|
|
mem_total=$(free -m | awk 'NR==2{printf "%.1f", $2/1024}')
|
|
mem_used=$(free -m | awk 'NR==2{printf "%.1f", $3/1024}')
|
|
mem_available=$(free -m | awk 'NR==2{printf "%.1f", $7/1024}')
|
|
mem_percent=$(free | awk 'NR==2{printf "%.1f", $3*100/$2}')
|
|
print_message $CYAN " 内存: 已用 ${mem_total}GB / 总计 ${mem_total}GB (${mem_percent:-N/A}% 使用率)"
|
|
print_message $CYAN " 可用内存: ${mem_available:-N/A}GB"
|
|
else
|
|
# 适用于 macOS 的内存检查
|
|
if command -v vm_stat &> /dev/null; then
|
|
page_size=$(vm_stat | grep "page size" | awk '{print $6}' | sed 's/bytes//')
|
|
free_pages=$(vm_stat | grep free | awk '{print $3}' | sed 's/\.//')
|
|
inactive_pages=$(vm_stat | grep inactive | awk '{print $3}' | sed 's/\.//')
|
|
free_memory=$(( (free_pages + inactive_pages) * page_size / 1024 / 1024 / 1024 ))
|
|
print_message $CYAN " 可用内存 (估算): ${free_memory}GB"
|
|
fi
|
|
fi
|
|
|
|
if command -v df &> /dev/null; then
|
|
disk_usage=$(df -h . | awk 'NR==2 {print $5}' | sed 's/%//')
|
|
disk_total=$(df -h . | awk 'NR==2 {print $2}')
|
|
disk_used=$(df -h . | awk 'NR==2 {print $3}')
|
|
disk_available=$(df -h . | awk 'NR==2 {print $4}')
|
|
print_message $CYAN " 磁盘: 已用 ${disk_used} / 总计 ${disk_total} (${disk_usage:-N/A}% 使用率)"
|
|
print_message $CYAN " 可用磁盘: ${disk_available}"
|
|
fi
|
|
|
|
# 适用于 macOS 的 CPU 检查
|
|
if command -v top &> /dev/null; then
|
|
cpu_usage=$(top -l 1 | grep "CPU usage" | awk '{print $3}' | sed 's/%//' | cut -d'.' -f1)
|
|
print_message $CYAN " CPU 使用率: ${cpu_usage:-N/A}%"
|
|
fi
|
|
echo ""
|
|
|
|
# 检查后端状态
|
|
print_message $BLUE "📡 后端服务状态 (端口: $BACKEND_PORT):"
|
|
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 $GREEN " ✅ 后端进程运行中 (PID: $BACKEND_PID)"
|
|
|
|
# 检查进程详细信息
|
|
backend_cpu=$(ps -p $BACKEND_PID -o %cpu --no-headers 2>/dev/null | xargs || echo "N/A")
|
|
backend_mem=$(ps -p $BACKEND_PID -o %mem --no-headers 2>/dev/null | xargs || echo "N/A")
|
|
print_message $CYAN " CPU使用率: ${backend_cpu}%, 内存使用率: ${backend_mem}%"
|
|
|
|
# 尝试访问API文档
|
|
if curl -s --max-time 10 "http://localhost:$BACKEND_PORT/docs" > /dev/null 2>&1; then
|
|
print_message $GREEN " ✅ API服务可访问"
|
|
else
|
|
print_message $YELLOW " ⚠️ API服务可能未就绪"
|
|
fi
|
|
|
|
# 检查端口监听状态
|
|
if lsof -i :$BACKEND_PORT > /dev/null 2>&1; then
|
|
print_message $GREEN " ✅ 端口 $BACKEND_PORT 正在监听"
|
|
else
|
|
print_message $RED " ❌ 端口 $BACKEND_PORT 未监听"
|
|
fi
|
|
else
|
|
print_message $RED " ❌ 后端进程未运行 (PID: $BACKEND_PID)"
|
|
fi
|
|
else
|
|
print_message $RED " ❌ 后端进程未启动"
|
|
|
|
# 查找可能的后端进程
|
|
possible_pids=$(pgrep -f "uvicorn.*main:app" 2>/dev/null || echo "")
|
|
if [ ! -z "$possible_pids" ]; then
|
|
print_message $YELLOW " ⚠️ 检测到可能的后端进程: $possible_pids (但没有 PID 文件)"
|
|
fi
|
|
fi
|
|
|
|
echo ""
|
|
|
|
# 检查前端状态
|
|
print_message $BLUE "🎨 前端服务状态 (端口: $FRONTEND_PORT):"
|
|
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 $GREEN " ✅ 前端进程运行中 (PID: $FRONTEND_PID)"
|
|
|
|
# 检查进程详细信息
|
|
frontend_cpu=$(ps -p $FRONTEND_PID -o %cpu --no-headers 2>/dev/null | xargs || echo "N/A")
|
|
frontend_mem=$(ps -p $FRONTEND_PID -o %mem --no-headers 2>/dev/null | xargs || echo "N/A")
|
|
print_message $CYAN " CPU使用率: ${frontend_cpu}%, 内存使用率: ${frontend_mem}%"
|
|
|
|
# 尝试访问前端
|
|
if curl -s --max-time 10 "http://localhost:$FRONTEND_PORT" > /dev/null 2>&1; then
|
|
print_message $GREEN " ✅ 前端服务可访问"
|
|
else
|
|
print_message $YELLOW " ⚠️ 前端服务可能未就绪"
|
|
fi
|
|
|
|
# 检查端口监听状态
|
|
if lsof -i :$FRONTEND_PID > /dev/null 2>&1; then
|
|
print_message $GREEN " ✅ 端口 $FRONTEND_PID 正在监听"
|
|
else
|
|
print_message $RED " ❌ 端口 $FRONTEND_PID 未监听"
|
|
fi
|
|
else
|
|
print_message $RED " ❌ 前端进程未运行 (PID: $FRONTEND_PID)"
|
|
fi
|
|
else
|
|
print_message $RED " ❌ 前端进程未启动"
|
|
|
|
# 查找可能的前端进程
|
|
possible_pids=$(pgrep -f "vite" 2>/dev/null || echo "")
|
|
if [ ! -z "$possible_pids" ]; then
|
|
print_message $YELLOW " ⚠️ 检测到可能的前端进程: $possible_pids (但没有 PID 文件)"
|
|
fi
|
|
fi
|
|
|
|
echo ""
|
|
|
|
# 检查所有相关进程
|
|
print_message $BLUE "📋 系统中所有相关进程:"
|
|
all_backend_pids=$(pgrep -f "uvicorn.*main:app" 2>/dev/null)
|
|
all_frontend_pids=$(pgrep -f "vite" 2>/dev/null)
|
|
|
|
if [ ! -z "$all_backend_pids" ]; then
|
|
print_message $CYAN " 后端相关进程 (uvicorn):"
|
|
for pid in $all_backend_pids; do
|
|
cmd=$(ps -p $pid -o args --no-headers 2>/dev/null || echo "Unknown")
|
|
print_message $CYAN " PID $pid: $cmd"
|
|
done
|
|
else
|
|
print_message $YELLOW " 未找到后端相关进程 (uvicorn)"
|
|
fi
|
|
|
|
if [ ! -z "$all_frontend_pids" ]; then
|
|
print_message $CYAN " 前端相关进程 (vite):"
|
|
for pid in $all_frontend_pids; do
|
|
cmd=$(ps -p $pid -o args --no-headers 2>/dev/null || echo "Unknown")
|
|
print_message $CYAN " PID $pid: $cmd"
|
|
done
|
|
else
|
|
print_message $YELLOW " 未找到前端相关进程 (vite)"
|
|
fi
|
|
echo ""
|
|
|
|
# 检查网络端口状态
|
|
print_message $BLUE "🌐 网络端口状态:"
|
|
print_message $CYAN " 后端端口 $BACKEND_PORT: $(if lsof -i :$BACKEND_PORT > /dev/null 2>&1; then echo "✅ 监听中"; else echo "❌ 未监听"; fi)"
|
|
print_message $CYAN " 前端端口 $FRONTEND_PORT: $(if lsof -i :$FRONTEND_PORT > /dev/null 2>&1; then echo "✅ 监听中"; else echo "❌ 未监听"; fi)"
|
|
echo ""
|
|
|
|
# 检查日志文件
|
|
print_message $BLUE "📋 日志文件信息:"
|
|
log_files=("backend.log" "frontend.log" "startup.log" "stop.log" "status.log")
|
|
|
|
for log_file in "${log_files[@]}"; do
|
|
if [ -f "$log_file" ]; then
|
|
log_size=$(du -h "$log_file" 2>/dev/null | cut -f1 || echo "N/A")
|
|
log_lines=$(wc -l < "$log_file" 2>/dev/null || echo "0")
|
|
print_message $CYAN " $log_file: $log_size ($log_lines 行)"
|
|
|
|
# 显示最后5行日志
|
|
if [ $log_lines -gt 0 ]; then
|
|
print_message $CYAN " 最后5行日志:"
|
|
tail -5 "$log_file" | sed 's/^/ /'
|
|
fi
|
|
else
|
|
print_message $YELLOW " $log_file: 不存在"
|
|
fi
|
|
echo ""
|
|
done
|
|
|
|
# 检查数据库连接 (如果配置了PostgreSQL)
|
|
if command -v psql &> /dev/null && [[ "$DATABASE_URL" == *"postgresql://"* ]]; then
|
|
DB_HOST=$(echo $DATABASE_URL | sed -n 's/.*@//p' | cut -d':' -f1)
|
|
DB_PORT=$(echo $DATABASE_URL | sed -n 's/.*://p' | cut -d'/' -f1)
|
|
print_message $BLUE "🗄️ PostgreSQL 数据库状态 (Host: $DB_HOST, Port: $DB_PORT):"
|
|
if [ "$DB_HOST" == "localhost" ] || [ "$DB_HOST" == "127.0.0.1" ]; then
|
|
if lsof -i :$DB_PORT | grep LISTEN > /dev/null 2>&1; then
|
|
print_message $GREEN " ✅ PostgreSQL 服务运行正常"
|
|
|
|
# 尝试连接数据库
|
|
if echo "SELECT 1;" | psql "$DATABASE_URL" -tA > /dev/null 2>&1; then
|
|
print_message $GREEN " ✅ 数据库连接正常"
|
|
else
|
|
print_message $RED " ❌ 数据库连接失败"
|
|
fi
|
|
else
|
|
print_message $YELLOW " ⚠️ PostgreSQL 服务未运行"
|
|
fi
|
|
else
|
|
print_message $GREEN " ✅ 数据库配置: $DATABASE_URL"
|
|
fi
|
|
elif [[ "$DATABASE_URL" == *"sqlite://"* ]]; then
|
|
DB_PATH=$(echo $DATABASE_URL | sed 's/sqlite:\/\///')
|
|
print_message $BLUE "🗄️ SQLite 数据库状态:"
|
|
if [ -f "$DB_PATH" ]; then
|
|
db_size=$(du -h "$DB_PATH" 2>/dev/null | cut -f1 || echo "N/A")
|
|
print_message $GREEN " ✅ SQLite 数据库文件存在: $DB_PATH ($db_size)"
|
|
else
|
|
print_message $YELLOW " ⚠️ SQLite 数据库文件不存在: $DB_PATH"
|
|
fi
|
|
fi
|
|
|
|
echo ""
|
|
|
|
# 端口检查(检查是否其他应用占用预期端口)
|
|
print_message $BLUE "🔍 检查端口占用情况:"
|
|
occupied_ports=()
|
|
if lsof -i :$BACKEND_PORT > /dev/null 2>&1; then
|
|
port_user=$(lsof -i :$BACKEND_PORT | tail -n +2 | head -n 1 | awk '{print $1}')
|
|
port_pid=$(lsof -i :$BACKEND_PORT | tail -n +2 | head -n 1 | awk '{print $2}')
|
|
print_message $YELLOW " ⚠️ 后端端口 $BACKEND_PORT 被进程 $port_pid ($port_user) 占用"
|
|
occupied_ports+=("$BACKEND_PORT")
|
|
fi
|
|
|
|
if lsof -i :$FRONTEND_PORT > /dev/null 2>&1; then
|
|
port_user=$(lsof -i :$FRONTEND_PORT | tail -n +2 | head -n 1 | awk '{print $1}')
|
|
port_pid=$(lsof -i :$FRONTEND_PORT | tail -n +2 | head -n 1 | awk '{print $2}')
|
|
print_message $YELLOW " ⚠️ 前端端口 $FRONTEND_PORT 被进程 $port_pid ($port_user) 占用"
|
|
occupied_ports+=("$FRONTEND_PORT")
|
|
fi
|
|
|
|
if [ ${#occupied_ports[@]} -eq 0 ]; then
|
|
print_message $GREEN " ✅ 无端口冲突"
|
|
else
|
|
print_message $YELLOW " 提示: 如需使用这些端口,请先停止占用进程"
|
|
fi
|
|
|
|
echo ""
|
|
|
|
# 服务健康度评分
|
|
print_message $BLUE "💯 服务健康度评估:"
|
|
score=0
|
|
total_checks=0
|
|
|
|
# 检查后端
|
|
total_checks=$((total_checks + 1))
|
|
if [ -f ".backend.pid" ] && ps -p $(cat .backend.pid) > /dev/null 2>&1; then
|
|
if curl -s --max-time 5 "http://localhost:$BACKEND_PORT/docs" > /dev/null 2>&1; then
|
|
score=$((score + 1))
|
|
fi
|
|
fi
|
|
|
|
# 检查前端
|
|
total_checks=$((total_checks + 1))
|
|
if [ -f ".frontend.pid" ] && ps -p $(cat .frontend.pid) > /dev/null 2>&1; then
|
|
if curl -s --max-time 5 "http://localhost:$FRONTEND_PORT" > /dev/null 2>&1; then
|
|
score=$((score + 1))
|
|
fi
|
|
fi
|
|
|
|
# 计算健康度百分比
|
|
health_percentage=$((score * 100 / total_checks))
|
|
health_status=""
|
|
|
|
if [ $health_percentage -ge 80 ]; then
|
|
health_status="✅ 健康"
|
|
print_message $GREEN " $health_status: ${health_percentage}% ($score/$total_checks)"
|
|
elif [ $health_percentage -ge 50 ]; then
|
|
health_status="⚠️ 部分正常"
|
|
print_message $YELLOW " $health_status: ${health_percentage}% ($score/$total_checks)"
|
|
else
|
|
health_status="❌ 不健康"
|
|
print_message $RED " $health_status: ${health_percentage}% ($score/$total_checks)"
|
|
fi
|
|
echo ""
|
|
|
|
print_message $GREEN "🎉 状态检查完成!"
|
|
log_message "INFO" "系统状态检查完成,健康度: ${health_percentage}%" |