提交
This commit is contained in:
1 parent
fb6d0aa63c
commit
ff1228873c
37 files changed
+11861
-1823
No files matched your search
Executable
+304
@@ -0,0 +1,304 @@
|
||||
#!/bin/bash
|
||||
|
||||
# ===========================================
|
||||
# 学生状态变更处理脚本控制程序
|
||||
# 用于启动、停止、重启处理脚本
|
||||
# ===========================================
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
# Load configuration
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
CONFIG_FILE="${SCRIPT_DIR}/data.conf"
|
||||
|
||||
if [[ ! -f "$CONFIG_FILE" ]]; then
|
||||
echo "Error: Configuration file $CONFIG_FILE not found!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
source "$CONFIG_FILE"
|
||||
|
||||
# Script definitions
|
||||
declare -A SCRIPTS=(
|
||||
["changes"]="process_student_changes.sh"
|
||||
["resume"]="process_student_resume.sh"
|
||||
)
|
||||
|
||||
# PID files
|
||||
PID_DIR="${SCRIPT_DIR}/pids"
|
||||
mkdir -p "$PID_DIR"
|
||||
|
||||
# Functions
|
||||
log() {
|
||||
local level="$1"
|
||||
local message="$2"
|
||||
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
|
||||
echo "[$timestamp] [$level] $message"
|
||||
}
|
||||
|
||||
get_pid_file() {
|
||||
local script_name="$1"
|
||||
echo "${PID_DIR}/${script_name}.pid"
|
||||
}
|
||||
|
||||
get_lock_file() {
|
||||
local script_name="$1"
|
||||
echo "${SCRIPT_DIR}/${script_name}.lock"
|
||||
}
|
||||
|
||||
is_running() {
|
||||
local script_name="$1"
|
||||
local pid_file=$(get_pid_file "$script_name")
|
||||
local lock_file=$(get_lock_file "$script_name")
|
||||
|
||||
# Check PID file
|
||||
if [[ -f "$pid_file" ]]; then
|
||||
local pid=$(cat "$pid_file")
|
||||
if kill -0 "$pid" 2>/dev/null; then
|
||||
return 0 # Running
|
||||
else
|
||||
log "WARN" "Removing stale PID file for $script_name"
|
||||
rm -f "$pid_file"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Check lock file
|
||||
if [[ -f "$lock_file" ]]; then
|
||||
local lock_pid=$(cat "$lock_file")
|
||||
if kill -0 "$lock_pid" 2>/dev/null; then
|
||||
return 0 # Running
|
||||
else
|
||||
log "WARN" "Removing stale lock file for $script_name"
|
||||
rm -f "$lock_file"
|
||||
fi
|
||||
fi
|
||||
|
||||
return 1 # Not running
|
||||
}
|
||||
|
||||
start_script() {
|
||||
local script_name="$1"
|
||||
local script_file="${SCRIPT_DIR}/${SCRIPTS[$script_name]}"
|
||||
local pid_file=$(get_pid_file "$script_name")
|
||||
|
||||
if [[ ! -f "$script_file" ]]; then
|
||||
log "ERROR" "Script file not found: $script_file"
|
||||
return 1
|
||||
fi
|
||||
|
||||
if is_running "$script_name"; then
|
||||
log "INFO" "$script_name is already running"
|
||||
return 0
|
||||
fi
|
||||
|
||||
log "INFO" "Starting $script_name..."
|
||||
chmod +x "$script_file"
|
||||
|
||||
# Start script in background
|
||||
nohup "$script_file" > /dev/null 2>&1 &
|
||||
local pid=$!
|
||||
|
||||
# Wait a moment for script to start
|
||||
sleep 2
|
||||
|
||||
if kill -0 "$pid" 2>/dev/null; then
|
||||
echo $pid > "$pid_file"
|
||||
log "INFO" "$script_name started successfully (PID: $pid)"
|
||||
return 0
|
||||
else
|
||||
log "ERROR" "Failed to start $script_name"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
stop_script() {
|
||||
local script_name="$1"
|
||||
local pid_file=$(get_pid_file "$script_name")
|
||||
local lock_file=$(get_lock_file "$script_name")
|
||||
local stopped=false
|
||||
|
||||
log "INFO" "Stopping $script_name..."
|
||||
|
||||
# Try to stop by PID file
|
||||
if [[ -f "$pid_file" ]]; then
|
||||
local pid=$(cat "$pid_file")
|
||||
if kill -0 "$pid" 2>/dev/null; then
|
||||
kill "$pid"
|
||||
sleep 2
|
||||
if ! kill -0 "$pid" 2>/dev/null; then
|
||||
log "INFO" "$script_name stopped successfully (PID: $pid)"
|
||||
stopped=true
|
||||
fi
|
||||
fi
|
||||
rm -f "$pid_file"
|
||||
fi
|
||||
|
||||
# Try to stop by lock file
|
||||
if [[ -f "$lock_file" ]]; then
|
||||
local lock_pid=$(cat "$lock_file")
|
||||
if kill -0 "$lock_pid" 2>/dev/null; then
|
||||
kill "$lock_pid"
|
||||
sleep 2
|
||||
if ! kill -0 "$lock_pid" 2>/dev/null; then
|
||||
log "INFO" "$script_name stopped successfully (PID: $lock_pid)"
|
||||
stopped=true
|
||||
fi
|
||||
fi
|
||||
rm -f "$lock_file"
|
||||
fi
|
||||
|
||||
if [[ "$stopped" == false ]]; then
|
||||
log "WARN" "$script_name may not have been running or failed to stop gracefully"
|
||||
fi
|
||||
}
|
||||
|
||||
restart_script() {
|
||||
local script_name="$1"
|
||||
log "INFO" "Restarting $script_name..."
|
||||
stop_script "$script_name"
|
||||
sleep 3
|
||||
start_script "$script_name"
|
||||
}
|
||||
|
||||
status_script() {
|
||||
local script_name="$1"
|
||||
if is_running "$script_name"; then
|
||||
local pid_file=$(get_pid_file "$script_name")
|
||||
local lock_file=$(get_lock_file "$script_name")
|
||||
|
||||
if [[ -f "$pid_file" ]]; then
|
||||
local pid=$(cat "$pid_file")
|
||||
log "INFO" "$script_name is running (PID: $pid)"
|
||||
elif [[ -f "$lock_file" ]]; then
|
||||
local lock_pid=$(cat "$lock_file")
|
||||
log "INFO" "$script_name is running (PID: $lock_pid)"
|
||||
else
|
||||
log "INFO" "$script_name status unknown"
|
||||
fi
|
||||
else
|
||||
log "INFO" "$script_name is not running"
|
||||
fi
|
||||
}
|
||||
|
||||
show_usage() {
|
||||
cat << EOF
|
||||
Usage: $0 <command> <script_name>
|
||||
|
||||
Commands:
|
||||
start Start the specified script
|
||||
stop Stop the specified script
|
||||
restart Restart the specified script
|
||||
status Show status of the specified script
|
||||
startall Start all scripts
|
||||
stopall Stop all scripts
|
||||
statusall Show status of all scripts
|
||||
|
||||
Script names:
|
||||
changes Student status changes script (休学/退学/毕业)
|
||||
resume Student resume script (复学)
|
||||
all All scripts
|
||||
|
||||
Examples:
|
||||
$0 start changes # Start changes processing script
|
||||
$0 stop resume # Stop resume processing script
|
||||
$0 restart changes # Restart changes processing script
|
||||
$0 status all # Show status of all scripts
|
||||
$0 startall # Start all scripts
|
||||
$0 stopall # Stop all scripts
|
||||
|
||||
EOF
|
||||
}
|
||||
|
||||
# Main function
|
||||
main() {
|
||||
local command="${1:-}"
|
||||
local script_name="${2:-}"
|
||||
|
||||
case "$command" in
|
||||
start)
|
||||
if [[ "$script_name" == "all" ]]; then
|
||||
for script in "${!SCRIPTS[@]}"; do
|
||||
start_script "$script"
|
||||
done
|
||||
elif [[ -n "${SCRIPTS[$script_name]}" ]]; then
|
||||
start_script "$script_name"
|
||||
else
|
||||
log "ERROR" "Unknown script name: $script_name"
|
||||
show_usage
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
|
||||
stop)
|
||||
if [[ "$script_name" == "all" ]]; then
|
||||
for script in "${!SCRIPTS[@]}"; do
|
||||
stop_script "$script"
|
||||
done
|
||||
elif [[ -n "${SCRIPTS[$script_name]}" ]]; then
|
||||
stop_script "$script_name"
|
||||
else
|
||||
log "ERROR" "Unknown script name: $script_name"
|
||||
show_usage
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
|
||||
restart)
|
||||
if [[ "$script_name" == "all" ]]; then
|
||||
for script in "${!SCRIPTS[@]}"; do
|
||||
restart_script "$script"
|
||||
done
|
||||
elif [[ -n "${SCRIPTS[$script_name]}" ]]; then
|
||||
restart_script "$script_name"
|
||||
else
|
||||
log "ERROR" "Unknown script name: $script_name"
|
||||
show_usage
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
|
||||
status)
|
||||
if [[ "$script_name" == "all" ]]; then
|
||||
for script in "${!SCRIPTS[@]}"; do
|
||||
status_script "$script"
|
||||
done
|
||||
elif [[ -n "${SCRIPTS[$script_name]}" ]]; then
|
||||
status_script "$script_name"
|
||||
else
|
||||
log "ERROR" "Unknown script name: $script_name"
|
||||
show_usage
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
|
||||
startall)
|
||||
log "INFO" "Starting all scripts..."
|
||||
for script in "${!SCRIPTS[@]}"; do
|
||||
start_script "$script"
|
||||
done
|
||||
;;
|
||||
|
||||
stopall)
|
||||
log "INFO" "Stopping all scripts..."
|
||||
for script in "${!SCRIPTS[@]}"; do
|
||||
stop_script "$script"
|
||||
done
|
||||
;;
|
||||
|
||||
statusall)
|
||||
log "INFO" "Checking status of all scripts..."
|
||||
for script in "${!SCRIPTS[@]}"; do
|
||||
status_script "$script"
|
||||
done
|
||||
;;
|
||||
|
||||
*)
|
||||
log "ERROR" "Unknown command: $command"
|
||||
show_usage
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# Run main function
|
||||
main "$@"
|
||||
Reference in new issue
Block a user