#!/bin/bash # 生产环境停止脚本 # 用于停止验证码发送服务(邮件/短信) set -e # 遇到错误立即退出 # 获取脚本所在目录 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "$SCRIPT_DIR" # 颜色输出 GREEN='\033[0;32m' YELLOW='\033[1;33m' RED='\033[0;31m' NC='\033[0m' # No Color # 服务类型:email 或 sms 或 all SERVICE_TYPE="${1:-all}" # 停止服务的函数 stop_email_service() { PID_FILE="$SCRIPT_DIR/send_email.pid" if [ -f "$PID_FILE" ]; then PID=$(cat "$PID_FILE") if ps -p "$PID" > /dev/null 2>&1; then echo -e "${YELLOW}🛑 正在停止邮件服务 (PID: $PID)...${NC}" kill "$PID" # 等待进程结束 for i in {1..10}; do if ! ps -p "$PID" > /dev/null 2>&1; then break fi sleep 1 done # 如果还在运行,强制杀死 if ps -p "$PID" > /dev/null 2>&1; then echo -e "${YELLOW}⚠️ 强制停止邮件服务...${NC}" kill -9 "$PID" 2>/dev/null || true fi rm -f "$PID_FILE" echo -e "${GREEN}✅ 邮件服务已停止${NC}" else echo -e "${YELLOW}⚠️ 邮件服务进程不存在 (PID: $PID)${NC}" rm -f "$PID_FILE" fi else # 尝试通过进程名查找 PIDS=$(pgrep -f "send_email.py" || true) if [ -n "$PIDS" ]; then echo -e "${YELLOW}🛑 正在停止邮件服务 (通过进程名查找)...${NC}" echo "$PIDS" | xargs kill 2>/dev/null || true sleep 2 echo "$PIDS" | xargs kill -9 2>/dev/null || true echo -e "${GREEN}✅ 邮件服务已停止${NC}" else echo -e "${YELLOW}⚠️ 未找到运行中的邮件服务${NC}" fi fi } stop_sms_service() { PID_FILE="$SCRIPT_DIR/send_sms_gn.pid" if [ -f "$PID_FILE" ]; then PID=$(cat "$PID_FILE") if ps -p "$PID" > /dev/null 2>&1; then echo -e "${YELLOW}🛑 正在停止短信服务 (PID: $PID)...${NC}" kill "$PID" # 等待进程结束 for i in {1..10}; do if ! ps -p "$PID" > /dev/null 2>&1; then break fi sleep 1 done # 如果还在运行,强制杀死 if ps -p "$PID" > /dev/null 2>&1; then echo -e "${YELLOW}⚠️ 强制停止短信服务...${NC}" kill -9 "$PID" 2>/dev/null || true fi rm -f "$PID_FILE" echo -e "${GREEN}✅ 短信服务已停止${NC}" else echo -e "${YELLOW}⚠️ 短信服务进程不存在 (PID: $PID)${NC}" rm -f "$PID_FILE" fi else # 尝试通过进程名查找 PIDS=$(pgrep -f "send_sms_gn.py" || true) if [ -n "$PIDS" ]; then echo -e "${YELLOW}🛑 正在停止短信服务 (通过进程名查找)...${NC}" echo "$PIDS" | xargs kill 2>/dev/null || true sleep 2 echo "$PIDS" | xargs kill -9 2>/dev/null || true echo -e "${GREEN}✅ 短信服务已停止${NC}" else echo -e "${YELLOW}⚠️ 未找到运行中的短信服务${NC}" fi fi } # 根据参数停止相应服务 case "$SERVICE_TYPE" in email) stop_email_service ;; sms) stop_sms_service ;; all) stop_email_service sleep 1 stop_sms_service echo "" echo -e "${GREEN}✅ 所有服务已停止${NC}" ;; *) echo -e "${RED}❌ 错误: 未知的服务类型 '$SERVICE_TYPE'${NC}" echo "" echo "用法: $0 [email|sms|all]" echo "" echo "参数说明:" echo " email - 仅停止邮件验证码发送服务" echo " sms - 仅停止短信验证码发送服务" echo " all - 停止所有服务(默认)" exit 1 ;; esac