160 lines
4.8 KiB
Bash
160 lines
4.8 KiB
Bash
#!/bin/bash
|
||
|
||
echo "========================================"
|
||
echo " AI小红书项目 - 启动所有服务(生产环境)"
|
||
echo "========================================"
|
||
echo
|
||
|
||
# 检查Go环境
|
||
if ! command -v go &> /dev/null; then
|
||
echo "[错误] 未检测到Go环境,请先安装Go"
|
||
exit 1
|
||
fi
|
||
|
||
# 检查Python环境
|
||
if ! command -v python3 &> /dev/null; then
|
||
echo "[错误] 未检测到Python环境,请先安装Python3"
|
||
exit 1
|
||
fi
|
||
|
||
# 关闭已运行的服务
|
||
echo "[准备] 检查并关闭已运行的服务..."
|
||
|
||
# 从 PID 文件读取并关闭服务
|
||
if [ -f "logs/go_backend_prod.pid" ]; then
|
||
OLD_GO_PID=$(cat logs/go_backend_prod.pid)
|
||
if kill -0 $OLD_GO_PID 2>/dev/null; then
|
||
echo "[信息] 关闭旧的Go服务 (PID: $OLD_GO_PID)"
|
||
kill -9 $OLD_GO_PID 2>/dev/null
|
||
sleep 1
|
||
fi
|
||
rm -f logs/go_backend_prod.pid
|
||
fi
|
||
|
||
if [ -f "logs/python_backend_prod.pid" ]; then
|
||
OLD_PYTHON_PID=$(cat logs/python_backend_prod.pid)
|
||
if kill -0 $OLD_PYTHON_PID 2>/dev/null; then
|
||
echo "[信息] 关闭旧的Python服务 (PID: $OLD_PYTHON_PID)"
|
||
kill -9 $OLD_PYTHON_PID 2>/dev/null
|
||
sleep 1
|
||
fi
|
||
rm -f logs/python_backend_prod.pid
|
||
fi
|
||
|
||
# 强制清理:查找并杀掉所有相关的Go进程
|
||
echo "[检查] 查找并清理残留的Go服务进程..."
|
||
GO_PIDS=$(ps aux | grep "[g]o run main.go" | awk '{print $2}')
|
||
if [ ! -z "$GO_PIDS" ]; then
|
||
echo "[清理] 发现残留Go进程: $GO_PIDS"
|
||
echo $GO_PIDS | xargs kill -9 2>/dev/null
|
||
sleep 1
|
||
fi
|
||
|
||
# 强制清理:查找并杀掉所有相关的Python进程(只杀backend目录下的main.py)
|
||
echo "[检查] 查找并清理残留的Python服务进程..."
|
||
PYTHON_PIDS=$(ps aux | grep "[p]ython.*main.py" | grep backend | awk '{print $2}')
|
||
if [ ! -z "$PYTHON_PIDS" ]; then
|
||
echo "[清理] 发现残留Python进程: $PYTHON_PIDS"
|
||
echo $PYTHON_PIDS | xargs kill -9 2>/dev/null
|
||
sleep 1
|
||
fi
|
||
|
||
# 检查并清理端口占用(8070端口 - Go服务)
|
||
echo "[检查] 检查端口8070占用情况..."
|
||
PORT_8070_PID=$(lsof -ti:8070 2>/dev/null)
|
||
if [ ! -z "$PORT_8070_PID" ]; then
|
||
echo "[清理] 端口8070被占用 (PID: $PORT_8070_PID),正在清理..."
|
||
kill -9 $PORT_8070_PID 2>/dev/null
|
||
sleep 1
|
||
fi
|
||
|
||
# 检查并清理端口占用(8020端口 - Python服务)
|
||
echo "[检查] 检查端口8020占用情况..."
|
||
PORT_8020_PID=$(lsof -ti:8020 2>/dev/null)
|
||
if [ ! -z "$PORT_8020_PID" ]; then
|
||
echo "[清理] 端口8020被占用 (PID: $PORT_8020_PID),正在清理..."
|
||
kill -9 $PORT_8020_PID 2>/dev/null
|
||
sleep 1
|
||
fi
|
||
|
||
echo "[完成] 已关闭旧服务并清理端口占用"
|
||
echo
|
||
|
||
# 检查Python虚拟环境
|
||
if [ ! -d "backend/venv" ]; then
|
||
echo "[警告] Python虚拟环境不存在,正在创建..."
|
||
cd backend
|
||
python3 -m venv venv
|
||
source venv/bin/activate
|
||
echo "[信息] 正在安装Python依赖..."
|
||
pip install -r requirements.txt
|
||
cd ..
|
||
echo "[成功] Python虚拟环境创建完成"
|
||
echo
|
||
fi
|
||
|
||
# 创建日志目录
|
||
mkdir -p logs
|
||
|
||
# 启动Go后端服务
|
||
echo "[1/2] 正在启动Go后端服务(生产环境)..."
|
||
cd go_backend
|
||
go mod tidy
|
||
nohup go run main.go -env=prod > ../logs/go_backend_prod.log 2>&1 &
|
||
GO_PID=$!
|
||
echo "[Go服务] PID: $GO_PID"
|
||
cd ..
|
||
|
||
# 等待2秒
|
||
sleep 2
|
||
|
||
# 启动Python服务
|
||
echo "[2/2] 正在启动Python服务(生产环境)..."
|
||
cd backend
|
||
source venv/bin/activate
|
||
export ENV=prod
|
||
|
||
# 检查是否安装了Xvfb
|
||
if command -v xvfb-run &> /dev/null; then
|
||
echo "[Xvfb] 检测到Xvfb,Python服务将使用虚拟显示运行(避免无头模式被检测)"
|
||
nohup xvfb-run --auto-servernum --server-args="-screen 0 1920x1080x24" python main.py > ../logs/python_backend_prod.log 2>&1 &
|
||
PYTHON_PID=$!
|
||
echo "[Python服务] PID: $PYTHON_PID (使用Xvfb虚拟显示)"
|
||
else
|
||
echo "[警告] 未检测到Xvfb,Python服务将使用无头模式(可能触发验证)"
|
||
echo "[提示] 安装Xvfb: sudo apt-get install -y xvfb"
|
||
nohup python main.py > ../logs/python_backend_prod.log 2>&1 &
|
||
PYTHON_PID=$!
|
||
echo "[Python服务] PID: $PYTHON_PID (无头模式)"
|
||
fi
|
||
cd ..
|
||
|
||
echo
|
||
echo "========================================"
|
||
echo " 所有服务启动完成!(生产环境)"
|
||
echo "========================================"
|
||
echo
|
||
echo "[Go服务] PID: $GO_PID | 端口: 8070 (生产环境)"
|
||
echo "[Python服务] PID: $PYTHON_PID | 端口: 8020 (生产环境)"
|
||
echo
|
||
echo "日志文件:"
|
||
echo " Go服务: logs/go_backend_prod.log"
|
||
echo " Python服务: logs/python_backend_prod.log"
|
||
echo
|
||
echo "停止服务命令:"
|
||
echo " kill $GO_PID $PYTHON_PID"
|
||
echo
|
||
echo "查看日志:"
|
||
echo " tail -f logs/go_backend_prod.log"
|
||
echo " tail -f logs/python_backend_prod.log"
|
||
echo
|
||
echo "注意:使用 config.prod.yaml 生产配置"
|
||
echo
|
||
|
||
# 保存PID到文件,方便后续停止
|
||
echo $GO_PID > logs/go_backend_prod.pid
|
||
echo $PYTHON_PID > logs/python_backend_prod.pid
|
||
|
||
echo "PID已保存到 logs/*_prod.pid 文件"
|
||
echo
|