开发者指南 · 13

跨平台启动器(launcher.py)

13.1 功能

  • 旧实例检测:通过端口扫描(lsof / netstat)检测已运行的 JellyfishBot 进程
  • 用户确认后杀掉:列出占用端口的进程,SIGTERM → SIGKILL
  • 自动端口发现:默认 8000(后端) + 3000(前端),被占用时自动递增
  • 双进程管理:启动 uvicorn + Express,子进程异常退出时全部清理
  • 干净退出:Ctrl+C / SIGTERM 优雅终止(5s 超时后 SIGKILL)

13.2 日志 tee(2026-04-20)

所有由 launcher 拉起的子进程的 stdout+stderr 同时写到:

  • {project_dir}/logs/{name}-YYYYMMDD.log(按天滚动 + append + session header)
  • 原始 stdout

实现:_spawn_with_log(cmd, cwd, env, log_name) 替代裸 Popen,subprocess stdout/stderr 合并到 PIPE 后由 _tee_pipe_to(fh, src) 后台 daemon 线程逐行落盘。

⚠️ 不要回退到 subprocess.PIPE + communicate() — 长流程会阻塞 wait();当前实现的 daemon 线程 + bufsize=0 是验证过的非阻塞方案。

13.3 端口配置

文件配置方式
launcher.py--port / --frontend-port 命令行参数
server.jsFRONTEND_PORT / API_TARGET 环境变量
start.sh(Docker)BACKEND_PORT / FRONTEND_PORT 环境变量

13.4 使用

bash
python launcher.py                    # 生产模式
python launcher.py --dev              # 开发模式(uvicorn --reload + vite dev)
python launcher.py --port 9000        # 自定义后端端口
python launcher.py --backend-only     # 仅后端
python launcher.py --skip-check       # 跳过旧实例检测