diff --git a/start_system.py b/start_system.py new file mode 100755 index 0000000..558bca3 --- /dev/null +++ b/start_system.py @@ -0,0 +1,87 @@ +#!/usr/bin/env python3 +""" +系统启动脚本 +同时启动: +1. FastAPI 后端服务 (提供前端看板 API) +2. Polymarket 自动交易程序 +""" +import subprocess +import sys +import time +import signal +import os +from datetime import datetime + +# 颜色代码 +GREEN = '\033[92m' +YELLOW = '\033[93m' +RED = '\033[91m' +RESET = '\033[0m' + +def log(message, color=RESET): + timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S') + print(f"{color}[{timestamp}] {message}{RESET}") + +def start_process(command, name): + """启动子进程""" + log(f"正在启动 {name}...", YELLOW) + try: + process = subprocess.Popen( + command, + shell=True, + stdout=sys.stdout, + stderr=sys.stderr, + preexec_fn=os.setsid # 创建新的进程组,方便统一杀掉 + ) + log(f"{name} 已启动 (PID: {process.pid})", GREEN) + return process + except Exception as e: + log(f"启动 {name} 失败: {e}", RED) + return None + +def main(): + # 激活 Conda 环境 + # 注意:在子进程中直接使用当前已激活的 python 解释器路径,避免 conda activate 问题 + python_exec = sys.executable + + # 1. 启动 API 服务 (Uvicorn) + # 使用 --host 0.0.0.0 允许局域网访问 + api_cmd = f"{python_exec} -m uvicorn api.main:app --host 0.0.0.0 --port 8000" + api_process = start_process(api_cmd, "API 服务 & 前端看板") + + # 等待几秒确保 API 启动 + time.sleep(3) + + # 2. 启动自动交易程序 + # 使用 -u 参数禁用输出缓冲 + trade_cmd = f"{python_exec} -u auto_trade_polymarket.py" + trade_process = start_process(trade_cmd, "Polymarket 自动交易程序") + + log("系统启动完成!", GREEN) + log("前端访问地址: http://localhost:8000", GREEN) + log("按 Ctrl+C 停止所有服务...", YELLOW) + + try: + # 监控子进程状态 + while True: + if api_process.poll() is not None: + log("API 服务意外退出", RED) + break + if trade_process.poll() is not None: + log("自动交易程序意外退出", RED) + break + time.sleep(1) + + except KeyboardInterrupt: + log("\n正在停止服务...", YELLOW) + finally: + # 优雅退出 + if api_process: + os.killpg(os.getpgid(api_process.pid), signal.SIGTERM) + if trade_process: + os.killpg(os.getpgid(trade_process.pid), signal.SIGTERM) + + log("所有服务已停止", GREEN) + +if __name__ == "__main__": + main()