220 lines
6.8 KiB
Bash
Executable File
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 "$@"
|
|
|