#!/usr/bin/env bash # 实例测试流程固化脚本 # # ./scripts/test-instance.sh start # 编译新二进制 + 以当前目录 zhanlu.db 启动 # ./scripts/test-instance.sh stop # 停止进程 + 清理 *-shm/*-wal # ./scripts/test-instance.sh status # 查看运行状态 # # 可用环境变量覆盖默认值: # ZHANLU_DB_FILE 数据库路径 (默认 <项目根>/zhanlu.db) # ZHANLU_LISTEN_ADDR 监听地址 (默认 127.0.0.1:8080) set -euo pipefail # 项目根目录(脚本位于 scripts/ 下) ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" WORKDIR="$ROOT/tmp" # 二进制/pid/log 都放这里(已 gitignore) BIN="$WORKDIR/zhanlu-proxy-test" PIDFILE="$WORKDIR/test-instance.pid" LOGFILE="$WORKDIR/test-instance.log" DB="${ZHANLU_DB_FILE:-$ROOT/zhanlu.db}" ADDR="${ZHANLU_LISTEN_ADDR:-127.0.0.1:8080}" start() { mkdir -p "$WORKDIR" if [[ -f "$PIDFILE" ]] && kill -0 "$(cat "$PIDFILE")" 2>/dev/null; then echo "已有实例在运行 (pid $(cat "$PIDFILE")),请先执行: $0 stop" >&2 exit 1 fi echo "==> 编译二进制..." (cd "$ROOT" && go build -o "$BIN" ./cmd/zhanlu-proxy) echo "==> 启动 (db=$DB addr=$ADDR)" ZHANLU_DB_FILE="$DB" ZHANLU_LISTEN_ADDR="$ADDR" \ nohup "$BIN" > "$LOGFILE" 2>&1 & echo $! > "$PIDFILE" sleep 1 if ! kill -0 "$(cat "$PIDFILE")" 2>/dev/null; then echo "启动失败,日志:" >&2 cat "$LOGFILE" >&2 rm -f "$PIDFILE" exit 1 fi port="${ADDR##*:}" echo "==> 已启动 pid=$(cat "$PIDFILE")" echo " 管理后台: http://127.0.0.1:$port/admin" echo " 日志: $LOGFILE" echo " 测试完成后执行: $0 stop" } stop() { pid="" [[ -f "$PIDFILE" ]] && pid="$(cat "$PIDFILE")" if [[ -n "$pid" ]] && kill -0 "$pid" 2>/dev/null; then kill "$pid" 2>/dev/null || true # 优雅等待退出(给 SQLite checkpoint WAL 的时间) for _ in $(seq 1 40); do kill -0 "$pid" 2>/dev/null || break sleep 0.25 done if kill -0 "$pid" 2>/dev/null; then echo "==> 优雅退出超时,强制结束 pid=$pid" kill -9 "$pid" 2>/dev/null || true else echo "==> 已停止进程 pid=$pid" fi else echo "==> 无运行中的进程" fi rm -f "$PIDFILE" # 清理 wal/shm(与 DB 同目录同名) removed=0 for ext in db-shm db-wal; do f="${DB%.*}.$ext" if [[ -f "$f" ]]; then rm -f "$f" echo "==> 已清理 $f" removed=1 fi done [[ $removed -eq 0 ]] && echo "==> 无 shm/wal 需清理" rm -f "$BIN" echo "==> 完成" } status() { if [[ -f "$PIDFILE" ]] && kill -0 "$(cat "$PIDFILE")" 2>/dev/null; then echo "运行中 pid=$(cat "$PIDFILE") addr=$ADDR db=$DB" else echo "未运行" fi } case "${1:-}" in start) start ;; stop) stop ;; status) status ;; *) echo "用法: $0 {start|stop|status}" >&2; exit 1 ;; esac