#!/bin/bash # Sage Web Application Stop Script # Supports multi-process setup set -e # 切换到脚本所在目录 cd "$(dirname "$0")" WORKDIR="$(pwd)" PIDFILE="$WORKDIR/sage.pid" echo "=========================================" echo "停止 Sage Web Application" echo "=========================================" STOPPED_PIDS="" # 1. 尝试从 PID 文件停止 if [ -f "$PIDFILE" ]; then echo "读取 PID 文件..." while read -r APP_PID; do # 跳过空行 if [ -z "$APP_PID" ]; then continue; fi if kill -0 "$APP_PID" 2>/dev/null; then echo "正在停止 Worker (PID: $APP_PID) ..." kill "$APP_PID" 2>/dev/null || true STOPPED_PIDS="$STOPPED_PIDS $APP_PID" else echo "Worker (PID: $APP_PID) 已停止" fi done < "$PIDFILE" # 等待进程结束 WAIT_COUNT=0 while [ $WAIT_COUNT -lt 10 ]; do ALL_STOPPED=true for PID in $STOPPED_PIDS; do if kill -0 "$PID" 2>/dev/null; then ALL_STOPPED=false break fi done if $ALL_STOPPED; then break fi sleep 1 WAIT_COUNT=$((WAIT_COUNT + 1)) echo "等待服务关闭... ($WAIT_COUNT/10)" done # 强制杀死未退出的 for PID in $STOPPED_PIDS; do if kill -0 "$PID" 2>/dev/null; then echo "强制停止进程: $PID" kill -9 "$PID" 2>/dev/null || true fi done fi # 2. 兜底清理 (通过进程名查找,防止 PID 文件丢失) # 注意:这里匹配 app/sage.py PIDS=$(ps aux | grep "[a]pp/sage.py" | awk '{print $2}' || true) if [ -n "$PIDS" ]; then echo "发现残留进程,强制清理..." for PID in $PIDS; do kill -9 "$PID" 2>/dev/null || true done fi # 清理 PID 文件 rm -f "$PIDFILE" echo "=========================================" echo "服务已停止" echo "========================================="