Files
tushare/start_lite_system.sh
BrunoGao 904b0698ab feat: 新增持续学习系统与Docker部署优化
- 新增持续学习系统完整架构
- 添加AI训练自动化调度器和模型版本管理
- 优化Docker配置支持实时系统
- 新增数据源管理系统集成
- 改进WebSocket和API端口配置
- 添加系统监控和健康检查功能
2025-09-18 22:08:45 +08:00

414 lines
11 KiB
Bash
Executable File

#!/bin/bash
# ljwx-stock 轻量级系统启动脚本
# 无需数据库,使用模拟数据和AI模型
# 脚本目录
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"
# 虚拟环境
VENV_PATH="./tushare_venv/bin/activate"
# PID文件
API_PID_FILE="logs/lite_api.pid"
WS_PID_FILE="logs/lite_websocket.pid"
# 日志文件
API_LOG_FILE="logs/lite_api_server.log"
WS_LOG_FILE="logs/lite_websocket_server.log"
# 创建必要目录
mkdir -p logs
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
NC='\033[0m' # No Color
print_info() {
echo -e "${GREEN}[INFO]${NC} $1"
}
print_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
print_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
print_header() {
echo -e "${PURPLE}$1${NC}"
}
print_blue() {
echo -e "${BLUE}$1${NC}"
}
# 检查虚拟环境
check_venv() {
if [ ! -f "$VENV_PATH" ]; then
print_error "虚拟环境不存在: $VENV_PATH"
exit 1
fi
}
# 检查Ollama服务
check_ollama() {
print_info "检查Ollama服务..."
if ! curl -s http://localhost:11434/api/tags >/dev/null 2>&1; then
print_error "Ollama服务未运行,请先启动Ollama"
print_info "启动方法: ollama serve"
exit 1
fi
# 检查关键模型
if curl -s http://localhost:11434/api/tags | grep -q "ljwx-stock-comprehensive"; then
print_info "✅ AI模型已就绪"
else
print_warn "⚠️ 未找到ljwx-stock AI模型,将使用默认模型"
fi
}
# 启动API服务器
start_api_server() {
check_venv
source "$VENV_PATH"
if [ -f "$API_PID_FILE" ]; then
PID=$(cat "$API_PID_FILE")
if ps -p $PID > /dev/null 2>&1; then
print_warn "API服务器已在运行 (PID: $PID)"
return 1
else
print_info "清理过期API PID文件"
rm -f "$API_PID_FILE"
fi
fi
print_info "启动API服务器..."
nohup python lite_api_server.py > "$API_LOG_FILE" 2>&1 &
API_PID=$!
echo $API_PID > "$API_PID_FILE"
# 等待服务启动
sleep 3
if ps -p $API_PID > /dev/null 2>&1; then
print_info "✅ API服务器启动成功 (PID: $API_PID)"
print_blue " 📡 访问地址: http://localhost:5005"
print_blue " 🔧 WebSocket测试: http://localhost:5005/api/websocket/test"
return 0
else
print_error "❌ API服务器启动失败"
rm -f "$API_PID_FILE"
return 1
fi
}
# 启动WebSocket服务器
start_websocket_server() {
check_venv
source "$VENV_PATH"
if [ -f "$WS_PID_FILE" ]; then
PID=$(cat "$WS_PID_FILE")
if ps -p $PID > /dev/null 2>&1; then
print_warn "WebSocket服务器已在运行 (PID: $PID)"
return 1
else
print_info "清理过期WebSocket PID文件"
rm -f "$WS_PID_FILE"
fi
fi
print_info "启动WebSocket服务器..."
nohup python lite_websocket_server.py > "$WS_LOG_FILE" 2>&1 &
WS_PID=$!
echo $WS_PID > "$WS_PID_FILE"
# 等待服务启动
sleep 3
if ps -p $WS_PID > /dev/null 2>&1; then
print_info "✅ WebSocket服务器启动成功 (PID: $WS_PID)"
print_blue " 📡 连接地址: ws://localhost:8765"
return 0
else
print_error "❌ WebSocket服务器启动失败"
rm -f "$WS_PID_FILE"
return 1
fi
}
# 停止API服务器
stop_api_server() {
if [ ! -f "$API_PID_FILE" ]; then
print_warn "API服务器PID文件不存在"
return 1
fi
PID=$(cat "$API_PID_FILE")
if ps -p $PID > /dev/null 2>&1; then
print_info "停止API服务器 (PID: $PID)..."
kill $PID
sleep 2
if ps -p $PID > /dev/null 2>&1; then
print_warn "强制停止API服务器..."
kill -9 $PID
fi
rm -f "$API_PID_FILE"
print_info "✅ API服务器已停止"
else
print_warn "API服务器进程不存在"
rm -f "$API_PID_FILE"
fi
}
# 停止WebSocket服务器
stop_websocket_server() {
if [ ! -f "$WS_PID_FILE" ]; then
print_warn "WebSocket服务器PID文件不存在"
return 1
fi
PID=$(cat "$WS_PID_FILE")
if ps -p $PID > /dev/null 2>&1; then
print_info "停止WebSocket服务器 (PID: $PID)..."
kill $PID
sleep 2
if ps -p $PID > /dev/null 2>&1; then
print_warn "强制停止WebSocket服务器..."
kill -9 $PID
fi
rm -f "$WS_PID_FILE"
print_info "✅ WebSocket服务器已停止"
else
print_warn "WebSocket服务器进程不存在"
rm -f "$WS_PID_FILE"
fi
}
# 启动所有服务
start_all() {
print_header "🚀 启动ljwx-stock轻量级系统"
print_header "=================================="
check_ollama
start_api_server
start_websocket_server
print_header ""
print_info "🎉 所有服务启动完成"
print_blue "📊 访问Web界面: http://localhost:5005"
print_blue "🔧 WebSocket测试: http://localhost:5005/api/websocket/test"
print_blue "📡 API文档: http://localhost:5005"
print_header ""
}
# 停止所有服务
stop_all() {
print_header "🛑 停止ljwx-stock轻量级系统"
print_header "=================================="
stop_api_server
stop_websocket_server
print_info "✅ 所有服务已停止"
}
# 检查服务状态
check_status() {
print_header "📊 ljwx-stock轻量级系统状态"
print_header "=================================="
# 检查API服务器
if [ -f "$API_PID_FILE" ]; then
PID=$(cat "$API_PID_FILE")
if ps -p $PID > /dev/null 2>&1; then
print_info "✅ API服务器运行中 (PID: $PID)"
if curl -s http://localhost:5005/api/health >/dev/null 2>&1; then
print_blue " 📡 服务健康: http://localhost:5005"
else
print_warn " ⚠️ 服务可能有问题"
fi
else
print_error "❌ API服务器PID文件存在但进程未运行"
rm -f "$API_PID_FILE"
fi
else
print_error "❌ API服务器未运行"
fi
# 检查WebSocket服务器
if [ -f "$WS_PID_FILE" ]; then
PID=$(cat "$WS_PID_FILE")
if ps -p $PID > /dev/null 2>&1; then
print_info "✅ WebSocket服务器运行中 (PID: $PID)"
print_blue " 📡 连接地址: ws://localhost:8765"
else
print_error "❌ WebSocket服务器PID文件存在但进程未运行"
rm -f "$WS_PID_FILE"
fi
else
print_error "❌ WebSocket服务器未运行"
fi
# 检查Ollama
if curl -s http://localhost:11434/api/tags >/dev/null 2>&1; then
print_info "✅ Ollama AI服务运行中"
model_count=$(curl -s http://localhost:11434/api/tags | grep -c '"name"' || echo "0")
print_blue " 🤖 可用模型: $model_count 个"
else
print_error "❌ Ollama AI服务未运行"
fi
}
# 运行健康检查
health_check() {
check_venv
source "$VENV_PATH"
print_info "运行系统健康检查..."
python system_monitor.py
}
# 查看日志
view_logs() {
local service=$1
case "$service" in
"api")
if [ -f "$API_LOG_FILE" ]; then
print_info "API服务器日志 (最后50行):"
tail -50 "$API_LOG_FILE"
else
print_warn "API日志文件不存在"
fi
;;
"websocket"|"ws")
if [ -f "$WS_LOG_FILE" ]; then
print_info "WebSocket服务器日志 (最后50行):"
tail -50 "$WS_LOG_FILE"
else
print_warn "WebSocket日志文件不存在"
fi
;;
"all"|"")
print_info "=== API服务器日志 ==="
if [ -f "$API_LOG_FILE" ]; then
tail -25 "$API_LOG_FILE"
else
echo "日志文件不存在"
fi
print_info ""
print_info "=== WebSocket服务器日志 ==="
if [ -f "$WS_LOG_FILE" ]; then
tail -25 "$WS_LOG_FILE"
else
echo "日志文件不存在"
fi
;;
*)
print_error "未知服务: $service"
print_info "可用选项: api, websocket, all"
;;
esac
}
# 使用帮助
show_help() {
print_header "ljwx-stock 轻量级系统管理脚本"
print_header "======================================="
echo ""
echo "使用方法:"
echo " $0 [命令]"
echo ""
echo "命令:"
echo " start 启动所有服务 (API + WebSocket)"
echo " stop 停止所有服务"
echo " restart 重启所有服务"
echo " status 查看服务状态"
echo " health 运行健康检查"
echo " logs [服务] 查看日志 (api|websocket|all)"
echo " help 显示帮助"
echo ""
echo "单独服务控制:"
echo " start-api 仅启动API服务器"
echo " start-ws 仅启动WebSocket服务器"
echo " stop-api 仅停止API服务器"
echo " stop-ws 仅停止WebSocket服务器"
echo ""
echo "访问地址:"
echo " Web界面: http://localhost:5005"
echo " API接口: http://localhost:5005/api/"
echo " WebSocket: ws://localhost:8765"
echo " WebSocket测试: http://localhost:5005/api/websocket/test"
echo ""
echo "示例:"
echo " $0 start # 启动系统"
echo " $0 status # 查看状态"
echo " $0 logs api # 查看API日志"
echo " $0 health # 健康检查"
}
# 主逻辑
case "$1" in
start)
start_all
;;
stop)
stop_all
;;
restart)
stop_all
sleep 2
start_all
;;
start-api)
check_ollama
start_api_server
;;
start-ws)
start_websocket_server
;;
stop-api)
stop_api_server
;;
stop-ws)
stop_websocket_server
;;
status)
check_status
;;
health)
health_check
;;
logs)
view_logs "$2"
;;
help|--help|-h)
show_help
;;
"")
print_error "请指定命令"
echo ""
show_help
exit 1
;;
*)
print_error "未知命令: $1"
echo ""
show_help
exit 1
;;
esac