macOS 上 /usr/local/bin/ss 由 iproute2mac 提供(netstat 包装),输出以 TAB 分隔且 -p 不产出 pid=,导致 listener_pids 恒为空: - port_in_use 永远为假 → start 重复拉起 uvicorn 并报 [Errno 48] Address already in use,最终 die "后端启动超时" - status 误报"未运行",stop 定位不到监听进程 改为 lsof 优先、ss 兜底(保留 Linux 真 iproute2 的 pid= 提取),并用 ([^0-9]|$) 界定端口边界以兼容空格/TAB 两种分隔。显式 if 替代 [[ ]] && ——bash 3.2 在 set -e 下会因中途失败的 && 列表直接退出。
scripts
数据同步 / 运维 / 自检脚本。
自检脚本(改完对应部分就跑一遍)
| 脚本 | 检查什么 | 用法 |
|---|---|---|
verify_strategy_workspace.py |
策略库 / 回测 / 归档链路的端到端契约(含按 kind 逐类验证归档页) | python3 scripts/verify_strategy_workspace.py(--skip-job 跳过真实回测) |
verify_backtest_page_contract.py |
回测页与后端字段契约(净值点数、个股曲线数、收益口径) | python3 scripts/verify_backtest_page_contract.py |
verify_ui_alignment.py |
UI 对齐与控件一致性:同排控件等高、尺寸归一、点击目标、标签与无障碍名、圆角/字号一致、无横向溢出、提示不裁切 | python3 scripts/verify_ui_alignment.py(--dump 打印几何明细,--width 375 只测小屏) |
qlib_verify.py |
pyqlib 安装与数据落盘基线 | cd backend && uv run python ../scripts/qlib_verify.py |
verify_ui_alignment.py 用系统 Chrome + 原生 CDP(仅标准库实现,不依赖 playwright),
独占随机端口与临时 profile,不会干扰你正在用的浏览器。
数据 / 运维
| 脚本 | 用途 |
|---|---|
run_dividend_case.py |
复现高股息案例(全市场股息率 TopN、每 m 月择股) |
migrate_sqlite_to_mysql.py |
历史 SQLite 数据迁移到本机 MariaDB |
grant_local_mysql_user.sql / mysql_recover_and_grants.sh |
本机 MariaDB 账号与权限 |
dev.sh |
一键起后端 + 前端(开发用) |