#!/bin/bash # 配置参数 # 如果你使用的是虚拟环境,建议直接使用虚拟环境的python # 修改这里使用你的虚拟环境路径 VENV_PATH="/home/work/keyword_crawl/venv" APP_PATH="/home/work/keyword_crawl" # 修改为你的应用所在目录 APP_NAME="flask_wht_server_api:app" PORT="8216" WORKERS="6" LOG_FILE="log10bjh_wht_server_api_$(date +%y%m%d%H%M).log" PID_FILE="/tmp/gunicorn_wht_server_api.pid" TIMEOUT=30 # 进入应用目录 cd "$APP_PATH" || { echo "Failed to change directory to $APP_PATH" exit 1 } # (1) 停止现有进程 stop_previous_process() { echo "Checking for existing processes..." # 检查Gunicorn的PID文件 if [ -f "$PID_FILE" ]; then read -r PID < "$PID_FILE" 2>/dev/null if [ -n "$PID" ]; then echo "Found Gunicorn PID file with PID: $PID" if ps -p "$PID" > /dev/null 2>&1; then echo "Stopping Gunicorn master process (PID: $PID)..." kill "$PID" 2>/dev/null # 等待进程结束 local count=0 while ps -p "$PID" > /dev/null 2>&1 && [ $count -lt 10 ]; do sleep 1 count=$((count + 1)) done # 如果进程还在,强制杀死 if ps -p "$PID" > /dev/null 2>&1; then echo "Force killing Gunicorn master..." kill -9 "$PID" 2>/dev/null fi fi fi rm -f "$PID_FILE" fi # 杀死所有残留的Worker进程 WORKER_PIDS=$(pgrep -f "gunicorn.*$APP_NAME" 2>/dev/null || pgrep -f "flask_wht_server_api" 2>/dev/null) if [ -n "$WORKER_PIDS" ]; then echo "Killing leftover worker processes: $WORKER_PIDS" kill -9 $WORKER_PIDS 2>/dev/null sleep 2 fi } # (2) 启动新进程 start_new_process() { echo "Starting new Gunicorn server..." # 激活虚拟环境(如果需要) if [ -f "$VENV_PATH/bin/activate" ]; then source "$VENV_PATH/bin/activate" fi # 使用虚拟环境中的gunicorn GUNICORN_CMD="$VENV_PATH/bin/gunicorn" # 如果虚拟环境中没有gunicorn,使用系统默认 if [ ! -f "$GUNICORN_CMD" ]; then echo "Warning: gunicorn not found in virtual environment, using system default" GUNICORN_CMD="gunicorn" fi # 构建命令 CMD="$GUNICORN_CMD -w $WORKERS -b 0.0.0.0:$PORT --pid $PID_FILE --timeout $TIMEOUT $APP_NAME" echo "Executing: $CMD" # 启动服务并记录日志 nohup $CMD >> "$LOG_FILE" 2>&1 & # 保存后台进程PID GUNICORN_PID=$! echo "Gunicorn started with PID: $GUNICORN_PID" # 等待一会儿确保服务启动 sleep 3 # 检查进程是否还在运行 if kill -0 $GUNICORN_PID 2>/dev/null; then echo "Server started successfully." echo "Log file: $LOG_FILE" echo "PID file: $PID_FILE" echo "Port: $PORT" # 检查端口是否监听 if netstat -tulpn 2>/dev/null | grep ":$PORT " >/dev/null; then echo "Port $PORT is listening." else echo "Warning: Port $PORT may not be listening yet." fi else echo "Error: Server failed to start!" echo "Check the log file for details: $LOG_FILE" exit 1 fi } # 主执行流程 echo "========================================" echo "Deploying Flask Application" echo "========================================" echo "Application: $APP_NAME" echo "Port: $PORT" echo "Workers: $WORKERS" echo "Log file: $LOG_FILE" echo "========================================" # 停止旧进程 stop_previous_process sleep 2 # 启动新进程 start_new_process # 显示进程状态 echo "" echo "Current process status:" ps aux | grep -E "(gunicorn|$APP_NAME)" | grep -v grep echo "" echo "Deployment completed!"