chore: 增强start.sh, 支持--clean清库/--rebuild强制编译

This commit is contained in:
jackyu66git
2026-05-04 02:03:17 +08:00
parent d1e6c965cb
commit 15a4684208
+52 -14
View File
@@ -1,6 +1,9 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# exchange-monitor 启动脚本 # exchange-monitor 启动脚本
# 自动检测端口占用并清理旧进程 # 自动检测端口占用并清理旧进程
# 用法: ./start.sh [--clean] [--rebuild]
# --clean 删除数据库后重新启动(数据库重置)
# --rebuild 强制重编译(即使源码无变更)
set -e set -e
@@ -8,33 +11,68 @@ cd "$(dirname "$0")"
PORT=8888 PORT=8888
BIN="./exchange-monitor" BIN="./exchange-monitor"
LOG="exchange-monitor.log" LOG="exchange-monitor.log"
GO_CMD="/home/jack/.local/go/bin/go"
# 检查端口占用,释放旧进程 # 解析参数
PID=$(ss -tlnp 2>/dev/null | grep ":$PORT " | sed -n 's/.*pid=\([0-9]*\).*/\1/p') CLEAN_DB=false
if [ -n "$PID" ]; then FORCE_REBUILD=false
echo "[start] Port $PORT 被 PID=$PID 占用,尝试优雅停止..." for arg in "$@"; do
kill "$PID" 2>/dev/null || true case "$arg" in
--clean) CLEAN_DB=true ;;
--rebuild) FORCE_REBUILD=true ;;
esac
done
# 清理旧进程(通过进程名而非端口,更可靠)
OLD_PIDS=$(pgrep -f 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 sleep 1
# 强制清理 # 强制清理
if kill -0 "$PID" 2>/dev/null; then STILL_RUNNING=$(pgrep -f exchange-monitor 2>/dev/null || true)
echo "[start] 强制终止 PID=$PID..." if [ -n "$STILL_RUNNING" ]; then
kill -9 "$PID" 2>/dev/null || true echo "[start] 强制终止..."
kill -9 $STILL_RUNNING 2>/dev/null || true
sleep 1 sleep 1
fi fi
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
# 编译
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 web/static -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 if ss -tlnp 2>/dev/null | grep -q ":$PORT "; then
echo "[start] ERROR: 端口 $PORT 仍被占用,放弃启动" echo "[start] ERROR: 端口 $PORT 仍被占用,放弃启动"
exit 1 exit 1
fi fi
# 编译(如果源码或嵌入文件有变更)
if [ ! -x "$BIN" ] || [ -n "$(find . -name '*.go' -newer "$BIN" 2>/dev/null | head -1)" ] || [ -n "$(find web/static -newer "$BIN" 2>/dev/null | head -1)" ]; then
echo "[start] 编译新二进制..."
go build -o "$BIN" . 2>&1
fi
# 启动 # 启动
echo "[start] 启动 exchange-monitor (端口 $PORT)..." echo "[start] 启动 exchange-monitor (端口 $PORT)..."
nohup "$BIN" >> "$LOG" 2>&1 & nohup "$BIN" >> "$LOG" 2>&1 &