diff --git a/start.sh b/start.sh new file mode 100755 index 0000000..855a5b7 --- /dev/null +++ b/start.sh @@ -0,0 +1,55 @@ +#!/usr/bin/env bash +# exchange-monitor 启动脚本 +# 自动检测端口占用并清理旧进程 + +set -e + +cd "$(dirname "$0")" +PORT=8888 +BIN="./exchange-monitor" +LOG="exchange-monitor.log" + +# 检查端口占用,释放旧进程 +PID=$(ss -tlnp 2>/dev/null | grep ":$PORT " | sed -n 's/.*pid=\([0-9]*\).*/\1/p') +if [ -n "$PID" ]; then + echo "[start] Port $PORT 被 PID=$PID 占用,尝试优雅停止..." + kill "$PID" 2>/dev/null || true + sleep 1 + # 强制清理 + if kill -0 "$PID" 2>/dev/null; then + echo "[start] 强制终止 PID=$PID..." + kill -9 "$PID" 2>/dev/null || true + sleep 1 + fi +fi + +# 确认端口空闲 +if ss -tlnp 2>/dev/null | grep -q ":$PORT "; then + echo "[start] ERROR: 端口 $PORT 仍被占用,放弃启动" + exit 1 +fi + +# 编译(如果源码有变更) +if [ ! -x "$BIN" ] || [ "$(find . -name '*.go' -newer "$BIN" 2>/dev/null | head -1)" ]; then + echo "[start] 编译新二进制..." + go build -o "$BIN" . 2>&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