| #!/bin/bash
|
|
|
|
|
|
|
|
|
|
|
| APP_NAME="智能分析系统"
|
| APP_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
| PYTHON_CMD="python"
|
| SERVER_SCRIPT="web_server.py"
|
| PID_FILE="${APP_DIR}/.server.pid"
|
| LOG_FILE="${APP_DIR}/server.log"
|
| MONITOR_INTERVAL=30
|
|
|
|
|
| RED='\033[0;31m'
|
| GREEN='\033[0;32m'
|
| YELLOW='\033[0;33m'
|
| BLUE='\033[0;34m'
|
| NC='\033[0m'
|
|
|
|
|
| show_help() {
|
| echo -e "${BLUE}${APP_NAME}管理脚本${NC}"
|
| echo "使用方法: $0 [命令]"
|
| echo ""
|
| echo "命令:"
|
| echo " start 启动服务"
|
| echo " stop 停止服务"
|
| echo " restart 重启服务"
|
| echo " status 查看服务状态"
|
| echo " monitor 以守护进程方式监控服务"
|
| echo " logs 查看日志"
|
| echo " help 显示此帮助信息"
|
| }
|
|
|
|
|
| check_prerequisites() {
|
|
|
| if ! command -v $PYTHON_CMD &> /dev/null; then
|
| echo -e "${RED}错误: 未找到Python命令。请确保Python已安装且在PATH中。${NC}"
|
| exit 1
|
| fi
|
|
|
|
|
| if [ ! -f "${APP_DIR}/${SERVER_SCRIPT}" ]; then
|
| echo -e "${RED}错误: 未找到服务器脚本 ${SERVER_SCRIPT}。${NC}"
|
| echo -e "${YELLOW}当前目录: $(pwd)${NC}"
|
| exit 1
|
| fi
|
| }
|
|
|
|
|
| get_pid() {
|
| if [ -f "$PID_FILE" ]; then
|
| local pid=$(cat "$PID_FILE")
|
| if ps -p $pid > /dev/null; then
|
| echo $pid
|
| return 0
|
| fi
|
| fi
|
|
|
| local pid=$(pgrep -f "python.*${SERVER_SCRIPT}" 2>/dev/null)
|
| if [ -n "$pid" ]; then
|
| echo $pid
|
| return 0
|
| fi
|
| echo ""
|
| return 1
|
| }
|
|
|
|
|
| start_server() {
|
| local pid=$(get_pid)
|
| if [ -n "$pid" ]; then
|
| echo -e "${YELLOW}警告: 服务已在运行 (PID: $pid)${NC}"
|
| return 0
|
| fi
|
|
|
| echo -e "${BLUE}正在启动${APP_NAME}...${NC}"
|
| cd "$APP_DIR"
|
|
|
|
|
| nohup $PYTHON_CMD $SERVER_SCRIPT > "$LOG_FILE" 2>&1 &
|
| local new_pid=$!
|
|
|
|
|
| echo $new_pid > "$PID_FILE"
|
|
|
|
|
| sleep 3
|
| if ps -p $new_pid > /dev/null; then
|
| echo -e "${GREEN}${APP_NAME}已成功启动 (PID: $new_pid)${NC}"
|
| return 0
|
| else
|
| echo -e "${RED}启动${APP_NAME}失败。查看日志获取更多信息: ${LOG_FILE}${NC}"
|
| return 1
|
| fi
|
| }
|
|
|
|
|
| stop_server() {
|
| local pid=$(get_pid)
|
| if [ -z "$pid" ]; then
|
| echo -e "${YELLOW}服务未运行${NC}"
|
| return 0
|
| fi
|
|
|
| echo -e "${BLUE}正在停止${APP_NAME} (PID: $pid)...${NC}"
|
|
|
|
|
| kill -15 $pid
|
|
|
|
|
| local max_wait=10
|
| local waited=0
|
| while ps -p $pid > /dev/null && [ $waited -lt $max_wait ]; do
|
| sleep 1
|
| waited=$((waited + 1))
|
| echo -ne "${YELLOW}等待服务停止 $waited/$max_wait ${NC}\r"
|
| done
|
| echo ""
|
|
|
|
|
| if ps -p $pid > /dev/null; then
|
| echo -e "${YELLOW}服务未响应优雅停止请求,正在强制终止...${NC}"
|
| kill -9 $pid
|
| sleep 1
|
| fi
|
|
|
|
|
| if ps -p $pid > /dev/null; then
|
| echo -e "${RED}无法停止服务 (PID: $pid)${NC}"
|
| return 1
|
| else
|
| echo -e "${GREEN}服务已成功停止${NC}"
|
| rm -f "$PID_FILE"
|
| return 0
|
| fi
|
| }
|
|
|
|
|
| restart_server() {
|
| echo -e "${BLUE}正在重启${APP_NAME}...${NC}"
|
| stop_server
|
| sleep 2
|
| start_server
|
| }
|
|
|
|
|
| check_status() {
|
| local pid=$(get_pid)
|
| if [ -n "$pid" ]; then
|
| local uptime=$(ps -o etime= -p $pid)
|
| local mem=$(ps -o %mem= -p $pid)
|
| local cpu=$(ps -o %cpu= -p $pid)
|
|
|
| echo -e "${GREEN}${APP_NAME}正在运行${NC}"
|
| echo -e " PID: ${BLUE}$pid${NC}"
|
| echo -e " 运行时间: ${BLUE}$uptime${NC}"
|
| echo -e " 内存使用: ${BLUE}$mem%${NC}"
|
| echo -e " CPU使用: ${BLUE}$cpu%${NC}"
|
| echo -e " 日志文件: ${BLUE}$LOG_FILE${NC}"
|
| return 0
|
| else
|
| echo -e "${YELLOW}${APP_NAME}未运行${NC}"
|
| return 1
|
| fi
|
| }
|
|
|
|
|
| monitor_server() {
|
| echo -e "${BLUE}开始监控${APP_NAME}...${NC}"
|
| echo -e "${BLUE}监控日志将写入: ${LOG_FILE}.monitor${NC}"
|
| echo -e "${YELLOW}按 Ctrl+C 停止监控${NC}"
|
|
|
|
|
| (
|
| while true; do
|
| local pid=$(get_pid)
|
| local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
|
|
|
| if [ -z "$pid" ]; then
|
| echo "$timestamp - 服务未运行,正在重启..." >> "${LOG_FILE}.monitor"
|
| cd "$APP_DIR"
|
| $PYTHON_CMD $SERVER_SCRIPT >> "$LOG_FILE" 2>&1 &
|
| local new_pid=$!
|
| echo $new_pid > "$PID_FILE"
|
| echo "$timestamp - 服务已重启 (PID: $new_pid)" >> "${LOG_FILE}.monitor"
|
| else
|
|
|
| local is_responsive=true
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| if [ "$is_responsive" = false ]; then
|
| echo "$timestamp - 服务无响应,正在重启..." >> "${LOG_FILE}.monitor"
|
| kill -9 $pid
|
| sleep 2
|
| cd "$APP_DIR"
|
| $PYTHON_CMD $SERVER_SCRIPT >> "$LOG_FILE" 2>&1 &
|
| local new_pid=$!
|
| echo $new_pid > "$PID_FILE"
|
| echo "$timestamp - 服务已重启 (PID: $new_pid)" >> "${LOG_FILE}.monitor"
|
| fi
|
| fi
|
|
|
| sleep $MONITOR_INTERVAL
|
| done
|
| ) &
|
|
|
|
|
| MONITOR_PID=$!
|
| echo $MONITOR_PID > "${APP_DIR}/.monitor.pid"
|
| echo -e "${GREEN}监控进程已启动 (PID: $MONITOR_PID)${NC}"
|
|
|
|
|
| trap 'kill $MONITOR_PID; echo -e "${YELLOW}监控已停止${NC}"; rm -f "${APP_DIR}/.monitor.pid"' INT
|
|
|
|
|
| wait $MONITOR_PID
|
| }
|
|
|
|
|
| view_logs() {
|
| if [ ! -f "$LOG_FILE" ]; then
|
| echo -e "${YELLOW}日志文件不存在: ${LOG_FILE}${NC}"
|
| return 1
|
| fi
|
|
|
| echo -e "${BLUE}显示最新的日志内容 (按Ctrl+C退出)${NC}"
|
| tail -f "$LOG_FILE"
|
| }
|
|
|
|
|
| main() {
|
| check_prerequisites
|
|
|
| local command=${1:-"help"}
|
|
|
| case $command in
|
| start)
|
| start_server
|
| ;;
|
| stop)
|
| stop_server
|
| ;;
|
| restart)
|
| restart_server
|
| ;;
|
| status)
|
| check_status
|
| ;;
|
| monitor)
|
| monitor_server
|
| ;;
|
| logs)
|
| view_logs
|
| ;;
|
| *)
|
| show_help
|
| ;;
|
| esac
|
| }
|
|
|
|
|
| main "$@" |