178 lines
4.2 KiB
Bash
Executable File
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
|