138 lines
3.9 KiB
Bash
138 lines
3.9 KiB
Bash
|
|
#!/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!"
|
|||
|
|
|