Files
hzdyjs/退学、休学、复学、毕业/stop_services.sh
T
2025-12-25 18:01:27 +08:00

178 lines
4.2 KiB
Bash
Executable File

#!/bin/bash
# ===========================================
# 学生状态变更处理服务停止脚本
# 用于停止所有相关的处理服务
# ===========================================
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
CONTROL_SCRIPT="${SCRIPT_DIR}/control_scripts.sh"
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
log() {
local level="$1"
local message="$2"
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
echo -e "${timestamp} [$level] $message"
}
success() {
log "${GREEN}SUCCESS${NC}" "$1"
}
error() {
log "${RED}ERROR${NC}" "$1"
}
warning() {
log "${YELLOW}WARNING${NC}" "$1"
}
# Check if control script exists and is executable
if [[ ! -x "$CONTROL_SCRIPT" ]]; then
error "Control script not found or not executable: $CONTROL_SCRIPT"
exit 1
fi
# Function to stop a service
stop_service() {
local service_name="$1"
local service_desc="$2"
log "INFO" "Stopping $service_desc..."
if "$CONTROL_SCRIPT" stop "$service_name"; then
success "$service_desc stopped successfully"
return 0
else
warning "$service_desc may not have been running"
return 0 # Not treating this as a hard error
fi
}
# Function to check service status after stop
check_service_stopped() {
local service_name="$1"
local service_desc="$2"
log "INFO" "Verifying $service_desc has stopped..."
if "$CONTROL_SCRIPT" status "$service_name" | grep -q "is not running"; then
success "$service_desc confirmed stopped"
return 0
else
warning "$service_desc may still be running"
return 1
fi
}
# Function to force kill if needed
force_kill_service() {
local service_name="$1"
local script_pattern="$2"
local service_desc="$3"
log "INFO" "Force killing $service_desc..."
if pkill -f "$script_pattern"; then
sleep 2
success "$service_desc force killed"
return 0
else
warning "No processes found for $service_desc"
return 0
fi
}
# Main function
main() {
local force_kill="${1:-false}"
log "INFO" "=== 学生状态变更处理服务停止脚本 ==="
if [[ "$force_kill" == "force" ]]; then
log "INFO" "Performing force stop of all services..."
# Force kill all related processes
force_kill_service "changes" "process_student_changes.sh" "学生状态变更处理服务"
force_kill_service "resume" "process_student_resume.sh" "学生复学处理服务"
# Clean up lock and PID files
log "INFO" "Cleaning up lock and PID files..."
rm -f "${SCRIPT_DIR}"/*.lock
rm -f "${SCRIPT_DIR}/pids"/*.pid
success "Force stop completed"
exit 0
fi
log "INFO" "Stopping all student status change processing services..."
# Stop services gracefully
stop_service "changes" "学生状态变更处理服务 (休学/退学/毕业)"
stop_service "resume" "学生复学处理服务"
# Wait a moment for services to fully stop
sleep 3
log "INFO" "=== 服务状态验证 ==="
# Check all services are stopped
check_service_stopped "changes" "学生状态变更处理服务 (休学/退学/毕业)"
check_service_stopped "resume" "学生复学处理服务"
# Final cleanup
log "INFO" "Performing final cleanup..."
rm -f "${SCRIPT_DIR}"/*.lock 2>/dev/null || true
rm -f "${SCRIPT_DIR}/pids"/*.pid 2>/dev/null || true
log "INFO" "=== 停止完成 ==="
success "所有服务已停止"
echo ""
echo "如果服务未能正常停止,请使用强制停止:"
echo " $0 force"
echo ""
echo "重新启动服务:"
echo " ./start_services.sh"
}
# Show usage
show_usage() {
cat << EOF
Usage: $0 [force]
停止所有学生状态变更处理服务。
Options:
force 强制杀死所有相关进程并清理锁文件
Examples:
$0 # 正常停止所有服务
$0 force # 强制停止所有服务
EOF
}
# Parse arguments
case "${1:-}" in
force)
main "force"
;;
-h|--help)
show_usage
;;
"")
main
;;
*)
error "Unknown option: $1"
show_usage
exit 1
;;
esac