#!/bin/bash # ============================================ # 本地开发环境停止脚本 # 用法: ./dev-stop.sh [选项] # 选项: # all - 停止所有服务(默认) # gateway - 仅停止网关 # sys - 仅停止系统服务 # cust - 仅停止客户服务 # proj - 仅停止项目服务 # req - 仅停止需求服务 # exp - 仅停止支出服务 # receipt - 仅停止票据服务 # file - 仅停止文件服务 # report - 仅停止报表服务 # frontend - 仅停止前端 # help - 显示帮助信息 # ============================================ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" APP_HOME="$(dirname "$SCRIPT_DIR")" LOG_DIR="${APP_HOME}/logs" # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color log_info() { echo -e "${GREEN}[INFO]${NC} $1" } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # 停止服务 # 参数: $1=服务名, $2=进程匹配模式 stop_service() { local name=$1 local pattern=$2 local pid_file="${LOG_DIR}/${name}.pid" if [ -f "${pid_file}" ]; then local pid=$(cat "${pid_file}") if ps -p ${pid} > /dev/null 2>&1; then log_info "停止 ${name} 服务 (PID: ${pid})..." kill ${pid} 2>/dev/null # 等待进程结束 local count=0 while ps -p ${pid} > /dev/null 2>&1; do if [ $count -ge 10 ]; then log_warn "${name} 未响应,强制终止..." kill -9 ${pid} 2>/dev/null break fi sleep 1 ((count++)) done log_info "${name} 服务已停止" else log_warn "${name} 服务未运行" fi rm -f "${pid_file}" else # 通过进程名查找 local pids=$(pgrep -f "${pattern}") if [ -n "${pids}" ]; then log_info "停止 ${name} 服务 (PIDs: ${pids})..." echo "${pids}" | xargs kill 2>/dev/null log_info "${name} 服务已停止" else log_warn "${name} 服务未运行" fi fi } # 停止网关 stop_gateway() { stop_service "gateway" "fund-gateway.*GatewayApplication" } # 停止系统服务 stop_sys() { stop_service "sys" "fund-sys.*SysApplication" } # 停止客户服务 stop_cust() { stop_service "cust" "fund-cust.*CustApplication" } # 停止项目服务 stop_proj() { stop_service "proj" "fund-proj.*ProjApplication" } # 停止需求服务 stop_req() { stop_service "req" "fund-req.*ReqApplication" } # 停止支出服务 stop_exp() { stop_service "exp" "fund-exp.*ExpApplication" } # 停止票据服务 stop_receipt() { stop_service "receipt" "fund-receipt.*ReceiptApplication" } # 停止文件服务 stop_file() { stop_service "file" "fund-file.*FileApplication" } # 停止报表服务 stop_report() { stop_service "report" "fund-report.*ReportApplication" } # 停止前端 stop_frontend() { log_info "停止前端服务..." # 停止 vite 进程 local vite_pids=$(pgrep -f "vite.*fund-admin") if [ -n "${vite_pids}" ]; then log_info "停止前端服务 (PIDs: ${vite_pids})..." echo "${vite_pids}" | xargs kill 2>/dev/null log_info "前端服务已停止" else log_warn "前端服务未运行" fi # 清理 PID 文件 rm -f "${LOG_DIR}/frontend.pid" } # 停止所有服务 stop_all() { log_info "==========================================" log_info "停止本地开发环境..." log_info "==========================================" stop_frontend stop_gateway stop_sys stop_cust stop_proj stop_req stop_exp stop_receipt stop_file stop_report log_info "==========================================" log_info "本地开发环境已停止" log_info "==========================================" } # 显示帮助 show_help() { echo "用法: $0 [选项]" echo "" echo "选项:" echo " all 停止所有服务(默认)" echo " gateway 仅停止网关服务" echo " sys 仅停止系统服务" echo " cust 仅停止客户服务" echo " proj 仅停止项目服务" echo " req 仅停止需求服务" echo " exp 仅停止支出服务" echo " receipt 仅停止票据服务" echo " file 仅停止文件服务" echo " report 仅停止报表服务" echo " frontend 仅停止前端服务" echo " help 显示此帮助信息" echo "" echo "示例:" echo " $0 # 停止所有服务" echo " $0 sys # 仅停止系统服务" echo " $0 frontend # 仅停止前端" } # 主入口 case "$1" in gateway) stop_gateway ;; sys) stop_sys ;; cust) stop_cust ;; proj) stop_proj ;; req) stop_req ;; exp) stop_exp ;; receipt) stop_receipt ;; file) stop_file ;; report) stop_report ;; frontend) stop_frontend ;; help|--help|-h) show_help ;; all|"") stop_all ;; *) log_error "未知选项: $1" show_help exit 1 ;; esac