./start.sh: 1. Detect if port 8888 is in use → kill gracefully, force if needed 2. Verify port free, rebuild if source changed, start in background 3. Wait up to 10s for readiness confirmation
56 lines
1.4 KiB
Bash
Executable File
56 lines
1.4 KiB
Bash
Executable File
#!/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
|