#!/usr/bin/env bash # exchange-monitor 启动脚本 # 自动检测端口占用并清理旧进程 # 用法: ./start.sh [--clean] [--rebuild] # --clean 删除数据库后重新启动(数据库重置) # --rebuild 强制重编译(即使源码无变更) set -e cd "$(dirname "$0")" PORT=8888 BIN="./exchange-monitor" LOG="exchange-monitor.log" GO_CMD="/home/jack/.local/go/bin/go" # 解析参数 CLEAN_DB=false FORCE_REBUILD=false for arg in "$@"; do case "$arg" in --clean) CLEAN_DB=true ;; --rebuild) FORCE_REBUILD=true ;; esac done # 清理旧进程(pkill 按进程名匹配,不会匹配到 start.sh 自身) OLD_PIDS=$(pgrep exchange-monitor 2>/dev/null || true) if [ -n "$OLD_PIDS" ]; then echo "[start] 停止旧进程 PID=$OLD_PIDS..." kill $OLD_PIDS 2>/dev/null || true sleep 1 # 强制清理 STILL_RUNNING=$(pgrep -f exchange-monitor 2>/dev/null || true) if [ -n "$STILL_RUNNING" ]; then echo "[start] 强制终止..." kill -9 $STILL_RUNNING 2>/dev/null || true sleep 1 fi fi # 可选:删除数据库 if [ "$CLEAN_DB" = true ]; then DB_PATH="$HOME/Project/exchange-monitor-go/data/trades.db" if [ -f "$DB_PATH" ]; then echo "[start] 删除数据库: $DB_PATH" rm -f "$DB_PATH" else echo "[start] 数据库不存在,跳过" fi fi # 设置代理(Clash Verge 本地代理,用于 Binance/OKX/Bitget WS 连接) export HTTPS_PROXY=http://127.0.0.1:7897 export HTTP_PROXY=http://127.0.0.1:7897 export NO_PROXY="localhost,127.0.0.1" # 编译 NEED_BUILD=false if [ ! -x "$BIN" ]; then NEED_BUILD=true elif [ "$FORCE_REBUILD" = true ]; then NEED_BUILD=true elif [ -n "$(find . -name '*.go' -newer "$BIN" 2>/dev/null | head -1)" ]; then NEED_BUILD=true elif [ -n "$(find frontend/dist -newer "$BIN" 2>/dev/null | head -1)" ]; then NEED_BUILD=true fi if [ "$NEED_BUILD" = true ]; then echo "[start] 编译新二进制..." $GO_CMD build -o "$BIN" . 2>&1 echo "[start] 编译完成" fi # 确认端口空闲 if ss -tlnp 2>/dev/null | grep -q ":$PORT "; then echo "[start] ERROR: 端口 $PORT 仍被占用,放弃启动" exit 1 fi # 启动 echo "[start] 启动 exchange-monitor (端口 $PORT)..." nohup "$BIN" >> "$LOG" 2>&1 & PID=$! echo "[start] PID=$PID" # 等待就绪 for i in $(seq 1 10); do if ss -tlnp 2>/dev/null | grep -q ":$PORT "; then echo "[start] 就绪 (${i}s)" echo "[start] http://localhost:$PORT" exit 0 fi sleep 1 done echo "[start] 启动超时(10s),请检查日志: tail -f $LOG" exit 1