inpaintServer/scripts/start_monitoring.sh

220 lines
6.8 KiB
Bash
Executable File

#!/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 "$@"