build / build (push) Successful in 2m32s
By-model panel gains a segmented 1天/7天/全部 control. Selecting a range fetches /api/stats?since=<RFC3339> and re-renders only that table client-side, replicating the human/rate template helpers in JS; the existing /api/stats since param already drives the server-side filter. - internal/server/templates/admin.html: filter UI + JS, empty/loading states - internal/server/server_test.go: render test for the filter controls - scripts/test-instance.sh: build→start→stop→clean test-instance helper
97 lines
2.8 KiB
Bash
Executable File
97 lines
2.8 KiB
Bash
Executable File
#!/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
|