开发者指南 · 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.js | FRONTEND_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 # 跳过旧实例检测