#!/bin/bash # 모니터링 대시보드 시작 스크립트 # Usage: ./start_monitoring.sh set -e # 색상 코드 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 로그 함수들 log_info() { echo -e "${BLUE}[INFO]${NC} $1" } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # 기본 설정 - 동적 경로 처리 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" MONITORING_PORT=8888 LOG_DIR="$PROJECT_ROOT/logs" # 가상환경 경로 자동 감지 detect_venv_path() { local possible_paths=( "$PROJECT_ROOT/venv" # 일반적인 venv 경로 "$PROJECT_ROOT/.venv" # 숨김 venv 경로 "$PROJECT_ROOT/env" # env 경로 "$PROJECT_ROOT/.env" # 숨김 env 경로 "$PROJECT_ROOT" # 프로젝트 루트 (Jetson 방식) ) for path in "${possible_paths[@]}"; do if [ -f "$path/bin/python" ] || [ -f "$path/bin/python3" ]; then VENV_PATH="$path" log_info "가상환경 경로 감지: $VENV_PATH" return 0 fi done # 현재 활성화된 가상환경 확인 if [ -n "$VIRTUAL_ENV" ]; then VENV_PATH="$VIRTUAL_ENV" log_info "활성화된 가상환경 사용: $VENV_PATH" return 0 fi # 가상환경을 찾지 못한 경우 시스템별 기본값 사용 if [ "$(uname -m)" = "aarch64" ] && uname -a | grep -q "tegra"; then VENV_PATH="$PROJECT_ROOT" log_warning "가상환경을 찾을 수 없어 Jetson 기본값 사용: $VENV_PATH" else VENV_PATH="$PROJECT_ROOT/venv" log_warning "가상환경을 찾을 수 없어 x86 기본값 사용: $VENV_PATH" fi } # 기존 모니터링 서버 중지 stop_existing_monitoring() { log_info "기존 모니터링 서버 확인 중..." # PID 파일이 있으면 해당 프로세스 종료 if [ -f "$LOG_DIR/monitoring.pid" ]; then local old_pid=$(cat "$LOG_DIR/monitoring.pid") if ps -p "$old_pid" > /dev/null 2>&1; then log_info "기존 모니터링 서버 종료 중... (PID: $old_pid)" kill "$old_pid" 2>/dev/null || true sleep 2 # 강제 종료가 필요한 경우 if ps -p "$old_pid" > /dev/null 2>&1; then log_warning "강제 종료 시도 중..." kill -9 "$old_pid" 2>/dev/null || true sleep 1 fi fi rm -f "$LOG_DIR/monitoring.pid" fi # 포트를 사용하는 프로세스 확인 및 종료 if lsof -Pi :$MONITORING_PORT -sTCP:LISTEN -t >/dev/null 2>&1; then log_warning "모니터링 포트 $MONITORING_PORT가 이미 사용 중입니다" log_info "포트를 사용하는 프로세스를 종료합니다..." # 프로세스 이름으로 종료 시도 pkill -f "dashboard:monitor_app" 2>/dev/null || true pkill -f "monitoring.dashboard" 2>/dev/null || true sleep 2 # 여전히 포트를 사용 중이면 강제 종료 if lsof -Pi :$MONITORING_PORT -sTCP:LISTEN -t >/dev/null 2>&1; then log_warning "포트를 강제로 해제합니다..." lsof -ti:$MONITORING_PORT | xargs -r kill -9 2>/dev/null || true sleep 2 fi # 최종 확인 if lsof -Pi :$MONITORING_PORT -sTCP:LISTEN -t >/dev/null 2>&1; then log_error "포트 $MONITORING_PORT를 해제할 수 없습니다" lsof -Pi :$MONITORING_PORT -sTCP:LISTEN exit 1 fi fi log_success "기존 모니터링 서버 정리 완료" } # 가상환경 활성화 activate_venv() { log_info "가상환경 활성화 중..." cd "$PROJECT_ROOT" if [ -f "$VENV_PATH/bin/activate" ]; then source "$VENV_PATH/bin/activate" log_success "가상환경 활성화 완료" else log_error "가상환경을 찾을 수 없습니다: $VENV_PATH/bin/activate" exit 1 fi # Python 버전 확인 PYTHON_VERSION=$(python --version 2>&1) log_info "Python 버전: $PYTHON_VERSION" } # 모니터링 서버 시작 start_monitoring_server() { log_info "모니터링 대시보드 시작 (포트: $MONITORING_PORT)..." # 로그 디렉토리 생성 mkdir -p "$LOG_DIR" # Python 경로 설정으로 import 문제 해결 cd "$PROJECT_ROOT" PYTHONPATH="$PROJECT_ROOT" nohup python -c " from app.monitoring.dashboard import monitor_app import uvicorn uvicorn.run(monitor_app, host='0.0.0.0', port=$MONITORING_PORT, log_level='info') " > "$LOG_DIR/monitoring.log" 2>&1 & echo $! > "$LOG_DIR/monitoring.pid" # 서버 시작 대기 log_info "모니터링 서버 초기화 대기 중... (최대 10초)" local timeout=10 local elapsed=0 local interval=1 while [ $elapsed -lt $timeout ]; do sleep $interval elapsed=$((elapsed + interval)) # 헬스체크 if curl -s "http://localhost:$MONITORING_PORT/api/simple" > /dev/null 2>&1; then log_success "모니터링 대시보드 시작 완료 (PID: $(cat $LOG_DIR/monitoring.pid)) - ${elapsed}초 소요" return 0 fi # 진행 상황 로깅 if [ $((elapsed % 3)) -eq 0 ]; then log_info "모니터링 서버 초기화 중... (${elapsed}/${timeout}초)" fi done # 최종 확인 if ! curl -s "http://localhost:$MONITORING_PORT/api/simple" > /dev/null 2>&1; then log_error "모니터링 서버 시작 실패 (${timeout}초 타임아웃)" log_info "로그를 확인하세요: tail -f $LOG_DIR/monitoring.log" exit 1 fi } # 상태 정보 출력 print_status() { echo "" echo "==========================================" echo "📊 모니터링 대시보드 시작 완료!" echo "==========================================" echo "모니터링 URL: http://localhost:$MONITORING_PORT" echo "API 엔드포인트: http://localhost:$MONITORING_PORT/api/simple" echo "" echo "PID: $(cat $LOG_DIR/monitoring.pid)" echo "로그 파일: $LOG_DIR/monitoring.log" echo "" echo "서버 중지: kill \$(cat $LOG_DIR/monitoring.pid)" echo "로그 확인: tail -f $LOG_DIR/monitoring.log" echo "==========================================" } # 메인 실행 main() { log_info "모니터링 대시보드 시작 스크립트 실행" detect_venv_path stop_existing_monitoring activate_venv start_monitoring_server print_status log_success "모니터링 대시보드가 성공적으로 시작되었습니다!" } # 스크립트 실행 main "$@"