- 新增持续学习系统完整架构 - 添加AI训练自动化调度器和模型版本管理 - 优化Docker配置支持实时系统 - 新增数据源管理系统集成 - 改进WebSocket和API端口配置 - 添加系统监控和健康检查功能
414 lines
11 KiB
Bash
Executable File
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 |