Files
ai_wht_wechat/restart.sh

247 lines
6.8 KiB
Bash
Raw Normal View History

2025-12-19 22:36:48 +08:00
#!/bin/bash
#########################################
# AI小红书 Go 后端服务重启脚本
# 用途: Ubuntu/Linux 环境下重启 Go 服务
# 支持: 开发环境(dev) 和 生产环境(prod)
#########################################
# 默认配置
DEFAULT_ENV="prod"
DEFAULT_PORT=8080
PROD_PORT=8070
LOG_FILE="ai_xhs.log"
MAIN_FILE="./go_backend/main.go"
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 帮助信息
show_help() {
echo -e "${BLUE}用法:${NC}"
echo " ./restart.sh [环境]"
echo ""
echo -e "${BLUE}环境参数:${NC}"
echo " dev - 开发环境 (默认, 端口 8080)"
echo " prod - 生产环境 (端口 8070)"
echo ""
echo -e "${BLUE}示例:${NC}"
echo " ./restart.sh # 启动开发环境"
echo " ./restart.sh dev # 启动开发环境"
echo " ./restart.sh prod # 启动生产环境"
exit 0
}
# 解析参数
ENV="${1:-$DEFAULT_ENV}"
if [ "$ENV" = "help" ] || [ "$ENV" = "-h" ] || [ "$ENV" = "--help" ]; then
show_help
fi
# 确定端口
if [ "$ENV" = "prod" ]; then
PORT=$PROD_PORT
else
PORT=$DEFAULT_PORT
ENV="dev"
fi
echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE} AI小红书 Go 后端服务重启脚本${NC}"
echo -e "${BLUE}========================================${NC}"
echo -e "${YELLOW}环境: $ENV${NC}"
echo -e "${YELLOW}端口: $PORT${NC}"
echo -e "${YELLOW}日志: $LOG_FILE${NC}"
echo ""
#########################################
# 1. 停止现有服务
#########################################
echo -e "${BLUE}=== [1/4] 停止现有服务 ===${NC}"
# 方法1: 查找 go run main.go 进程
GO_PIDS=$(ps aux | grep "go run $MAIN_FILE" | grep -v grep | awk '{print $2}')
if [ -n "$GO_PIDS" ]; then
echo -e "${YELLOW}找到 Go 服务进程: $GO_PIDS${NC}"
for PID in $GO_PIDS; do
kill -9 $PID 2>/dev/null && echo " 已终止进程: $PID"
done
sleep 1
fi
# 方法2: 查找编译后的可执行文件进程
COMPILED_PIDS=$(ps aux | grep "/tmp/go-build.*$MAIN_FILE" | grep -v grep | awk '{print $2}')
if [ -n "$COMPILED_PIDS" ]; then
echo -e "${YELLOW}找到编译后的进程: $COMPILED_PIDS${NC}"
for PID in $COMPILED_PIDS; do
kill -9 $PID 2>/dev/null && echo " 已终止进程: $PID"
done
sleep 1
fi
# 方法3: 强制清理占用端口的进程
echo -e "${YELLOW}清理端口 $PORT...${NC}"
# 使用 lsof 查找占用端口的进程
PORT_PID=$(lsof -ti:$PORT 2>/dev/null)
if [ -n "$PORT_PID" ]; then
echo " 端口 $PORT 被进程 $PORT_PID 占用"
kill -9 $PORT_PID 2>/dev/null && echo " 已终止进程: $PORT_PID"
fi
# 使用 fuser 强制清理 (需要 sudo)
if command -v fuser &> /dev/null; then
sudo fuser -k $PORT/tcp 2>/dev/null || true
fi
# 额外的清理方法
sudo pkill -f ":$PORT" 2>/dev/null || true
sudo pkill -f "main.go" 2>/dev/null || true
# 等待端口完全释放
sleep 2
# 验证端口是否释放
if lsof -ti:$PORT &> /dev/null; then
echo -e "${RED}⚠️ 警告: 端口 $PORT 仍被占用${NC}"
lsof -i:$PORT
else
echo -e "${GREEN}✅ 端口 $PORT 已释放${NC}"
fi
echo ""
#########################################
# 2. 环境检查
#########################################
echo -e "${BLUE}=== [2/4] 环境检查 ===${NC}"
# 检查 Go 环境
if ! command -v go &> /dev/null; then
echo -e "${RED}❌ 错误: 未检测到 Go 环境,请先安装 Go${NC}"
exit 1
fi
GO_VERSION=$(go version)
echo -e "${GREEN}✅ Go 环境: $GO_VERSION${NC}"
# 检查 main.go 是否存在
if [ ! -f "$MAIN_FILE" ]; then
echo -e "${RED}❌ 错误: 未找到 $MAIN_FILE 文件${NC}"
exit 1
fi
echo -e "${GREEN}✅ 主文件: $MAIN_FILE${NC}"
# 检查配置文件
CONFIG_FILE="config/config.${ENV}.yaml"
if [ ! -f "$CONFIG_FILE" ]; then
echo -e "${RED}❌ 错误: 未找到配置文件 $CONFIG_FILE${NC}"
exit 1
fi
echo -e "${GREEN}✅ 配置文件: $CONFIG_FILE${NC}"
echo ""
#########################################
# 3. 下载依赖
#########################################
echo -e "${BLUE}=== [3/4] 下载依赖 ===${NC}"
if [ -f "go.mod" ]; then
go mod tidy
echo -e "${GREEN}✅ 依赖下载完成${NC}"
else
echo -e "${YELLOW}⚠️ 未找到 go.mod 文件,跳过依赖下载${NC}"
fi
echo ""
#########################################
# 4. 启动服务
#########################################
echo -e "${BLUE}=== [4/4] 启动服务 ===${NC}"
# 设置环境变量
export APP_ENV=$ENV
# 清空旧日志
> $LOG_FILE
# 启动服务 (后台运行)
echo -e "${YELLOW}启动命令: nohup go run $MAIN_FILE > $LOG_FILE 2>&1 &${NC}"
nohup go run $MAIN_FILE > $LOG_FILE 2>&1 &
# 记录进程 PID
NEW_PID=$!
echo -e "${GREEN}✅ 服务已启动,进程 PID: $NEW_PID${NC}"
echo ""
#########################################
# 5. 验证启动
#########################################
echo -e "${BLUE}=== 启动验证 ===${NC}"
echo -e "${YELLOW}等待服务启动 (5秒)...${NC}"
sleep 5
# 检查进程是否存在
if ps -p $NEW_PID > /dev/null 2>&1; then
echo -e "${GREEN}✅ 服务进程运行正常 (PID: $NEW_PID)${NC}"
else
echo -e "${RED}❌ 服务进程未找到,可能启动失败${NC}"
echo -e "${YELLOW}最近日志:${NC}"
tail -n 20 $LOG_FILE
exit 1
fi
# 检查端口是否监听
if lsof -ti:$PORT &> /dev/null; then
echo -e "${GREEN}✅ 端口 $PORT 监听正常${NC}"
else
echo -e "${RED}❌ 端口 $PORT 未监听,服务可能启动失败${NC}"
echo -e "${YELLOW}最近日志:${NC}"
tail -n 20 $LOG_FILE
exit 1
fi
# 检查日志中是否有错误
if grep -i "fatal\|panic\|error" $LOG_FILE > /dev/null 2>&1; then
echo -e "${YELLOW}⚠️ 日志中发现错误信息:${NC}"
grep -i "fatal\|panic\|error" $LOG_FILE | head -n 5
fi
echo ""
#########################################
# 6. 完成信息
#########################################
echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN} 🎉 服务启动成功!${NC}"
echo -e "${GREEN}========================================${NC}"
echo ""
echo -e "${BLUE}服务信息:${NC}"
echo -e " 环境: ${YELLOW}$ENV${NC}"
echo -e " 端口: ${YELLOW}$PORT${NC}"
echo -e " 进程PID: ${YELLOW}$NEW_PID${NC}"
echo -e " 日志文件: ${YELLOW}$LOG_FILE${NC}"
echo ""
echo -e "${BLUE}快捷命令:${NC}"
echo -e " 查看日志: ${YELLOW}tail -f $LOG_FILE${NC}"
echo -e " 查看进程: ${YELLOW}ps aux | grep 'go run'${NC}"
echo -e " 停止服务: ${YELLOW}kill -9 $NEW_PID${NC}"
echo -e " 检查端口: ${YELLOW}lsof -i:$PORT${NC}"
echo ""
echo -e "${BLUE}访问地址:${NC}"
echo -e " 本地: ${GREEN}http://localhost:$PORT${NC}"
echo -e " API测试: ${GREEN}http://localhost:$PORT/api/health${NC}"
echo ""
echo -e "${YELLOW}提示: 使用 Ctrl+C 不会停止后台服务,请使用 kill 命令停止${NC}"