#!/bin/bash ############################################################################### # 百家号爬虫系统 - 停止脚本 # 功能:停止服务及所有任务线程 ############################################################################### # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # 项目配置 PROJECT_DIR="$(cd "$(dirname "$0")" && pwd)" APP_PORT=8030 PID_FILE="${PROJECT_DIR}/app.pid" GUNICORN_PID_FILE="${PROJECT_DIR}/gunicorn.pid" echo -e "${YELLOW}=========================================${NC}" echo -e "${YELLOW} 停止百家号爬虫服务${NC}" echo -e "${YELLOW}=========================================${NC}" echo "" # 通过 PID 文件停止 if [[ -f "${PID_FILE}" ]]; then PID=$(cat ${PID_FILE}) if ps -p ${PID} > /dev/null 2>&1; then echo "停止主进程 (PID: ${PID})..." kill ${PID} 2>/dev/null sleep 2 # 如果还在运行,强制终止 if ps -p ${PID} > /dev/null 2>&1; then echo "强制终止主进程..." kill -9 ${PID} 2>/dev/null fi echo -e "${GREEN}✓${NC} 主进程已停止" fi rm -f ${PID_FILE} fi # 停止 Gunicorn if [[ -f "${GUNICORN_PID_FILE}" ]]; then GUNICORN_PID=$(cat ${GUNICORN_PID_FILE}) if ps -p ${GUNICORN_PID} > /dev/null 2>&1; then echo "停止 Gunicorn 进程 (PID: ${GUNICORN_PID})..." kill ${GUNICORN_PID} 2>/dev/null sleep 2 if ps -p ${GUNICORN_PID} > /dev/null 2>&1; then echo "强制终止 Gunicorn..." kill -9 ${GUNICORN_PID} 2>/dev/null fi echo -e "${GREEN}✓${NC} Gunicorn 进程已停止" fi rm -f ${GUNICORN_PID_FILE} fi # 清理所有 app.py 进程 APP_PIDS=$(ps aux | grep "[p]ython.*app.py" | awk '{print $2}') if [[ -n "${APP_PIDS}" ]]; then echo "清理所有相关进程..." for pid in ${APP_PIDS}; do echo " 停止进程 ${pid}..." kill -9 ${pid} 2>/dev/null done echo -e "${GREEN}✓${NC} 所有进程已清理" else echo -e "${GREEN}✓${NC} 未发现运行中的进程" fi # 清理端口占用 PORT_PID=$(lsof -ti:${APP_PORT} 2>/dev/null) if [[ -n "${PORT_PID}" ]]; then echo "释放端口 ${APP_PORT}..." kill -9 ${PORT_PID} 2>/dev/null echo -e "${GREEN}✓${NC} 端口已释放" fi echo "" echo -e "${GREEN}服务已完全停止!${NC}" echo ""