CronTab - Application Health Check

2024. 5. 23. 13:07·💻 Server/Linux
목차
  1. CronTab 사용법

CronTab 사용법

특정 IP:Port에 대한 HTTP Request가 Connection Refused가 뜰 때 Docker Container를 Kill 하고 재기동 하는 Cron을 예시로 작성해 보겠습니다.

skw@skw:~$ curl -X GET http://localhost:3546/v1/core/instances
curl: (7) Failed to connect to localhost port 3546 after 0 ms: Connection refused

CronTab에 적용할 Shell Script를 먼저 작성해줍니다.

  • 로그 파일의 크기를 50MB로 제한
  • 50MB가 넘어갈 시 오래된 로그 삭제 및 새로운 로그로 대체
  • 특정 API에 GET 요청을 보냈을 때 Connection Refused가 아니라면 "XX is Running" 출력
  • 연결이 끊겼다면 Container를 중지하고 AI Model을 Headless로 재기동
  • Cron 작업은 사용자의 환경 변수를 상속받지 않기 때문에 PATH 변수 값을 포함해줍니다.
#!/bin/bash

# API 요청을 보낼 IP와 포트
IP="127.0.0.1"
PORT="3546"
LOG_FILE="/home/skw/logs/check.log"
MAX_LOG_SIZE=52428800  # 50MB

# 로그 파일 크기 관리 함수
manage_log_size() {
  if [ -f "$LOG_FILE" ]; then
    LOG_SIZE=$(stat -c%s "$LOG_FILE")
    if [ "$LOG_SIZE" -ge "$MAX_LOG_SIZE" ]; then
      mv "$LOG_FILE" "$LOG_FILE.bak"
      echo "Log file size exceeded, backing up and truncating." > "$LOG_FILE"
      tail -n 10000 "$LOG_FILE.bak" >> "$LOG_FILE"  # 마지막 10000줄만 유지
      rm "$LOG_FILE.bak"
    fi
  fi
}

# 환경변수 추가
export PATH=/usr/local/cuda-12.4/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

# echo 명령어의 출력만 로그 파일로 기록
{
  echo "$(date '+%Y-%m-%d %H:%M:%S') - Script started"

  # curl 요청을 보내고 connection refused 확인
  curl -X GET http://$IP:$PORT/v1/core/instance -o /dev/null 2>&1
  CURL_EXIT_CODE=$?

  if [ $CURL_EXIT_CODE -eq 7 ]; then # connection refused 발생 시 실행할 명령어들
    echo "$(date '+%Y-%m-%d %H:%M:%S') - Cvedia Connection Refused - Run Health Check"

    # 이름에 'cvedia'가 포함된 Docker 컨테이너 중지
    docker ps | grep cvedia | awk '{print $1}' | xargs -I {} docker stop {}
    echo "$(date '+%Y-%m-%d %H:%M:%S') - Kill Cvedia Container"

    # 스크립트 실행
    cd /home/skw/Cvedia-1.2
    sudo ./run.sh -m --disable_mqtt -- --net=host
    echo "$(date '+%Y-%m-%d %H:%M:%S') - Cvedia Engine Run with Headless Mode"
  else
    echo "$(date '+%Y-%m-%d %H:%M:%S') - Cvedia is Running"
  fi

  # 로그 파일 크기 관리
  manage_log_size

  echo "$(date '+%Y-%m-%d %H:%M:%S') - Script ended"
} >> "$LOG_FILE"

스크립트를 전부 작성 후 crontab -e를 입력하여 cron을 작성 해줍니다.

  • crontab -e 명령은 개인 사용자의 cron 설정합니다.
  • 전역 시스템 cron은 /etc/cron/crontab을 사용하면 됩니다.
*/2 * * * * /home/skw/health-check.sh

Cron이 제대로 실행 중인지 확인 & 로그 파일 확인

# Cron 실행 확인
grep CRON /var/log/syslog

# 로그 파일 잘 쌓이는지 확인
tail -f /home/skw/script/check.log

아래 이미지를 보면 2분마다 cron 작업 잘 실행되고 있습니다.


Docker Containeer를 수동으로 중지하고 2분 후 cron이 Health Check를 수행해 다시 Docker Container를 올립니다.

저작자표시 (새창열림)

'💻 Server > Linux' 카테고리의 다른 글

Redmine <-> NAS CIFS-Mount  (2) 2024.11.20
Prometheus & Grafana - Metric Monitoring  (0) 2024.06.21
Linux Graphic Driver & Remote GUI를 위한 TigerVNC 설정  (2) 2024.03.18
🚩 Headless OpenGL Rendering Error (TigerVNC & X11)  (4) 2024.01.24
🚩[GPU Driver 충돌] Nouveau Kernel Driver 제거  (7) 2023.12.27
  1. CronTab 사용법
'💻 Server/Linux' 카테고리의 다른 글
  • Redmine <-> NAS CIFS-Mount
  • Prometheus & Grafana - Metric Monitoring
  • Linux Graphic Driver & Remote GUI를 위한 TigerVNC 설정
  • 🚩 Headless OpenGL Rendering Error (TigerVNC & X11)
신건우
신건우
조용한 개발자
  • 신건우
    우주먼지
    신건우
  • 전체
    오늘
    어제
    • 분류 전체보기 (422)
      • 📘 Frontend (71)
        • Markup (1)
        • Style Sheet (2)
        • Dart (8)
        • Javascript (12)
        • TypeScript (1)
        • Vue (36)
        • React (2)
        • Flutter (9)
      • 📘 Backend (143)
        • Java (34)
        • Concurrency (19)
        • Reflection (1)
        • Kotlin (29)
        • Python (1)
        • Spring (42)
        • Spring Cloud (5)
        • Message Broker (5)
        • Streaming (2)
        • 기능 개발 (5)
      • 💻 Server (6)
        • Linux (6)
      • ❌ Error Handling (11)
      • 📦 Database (62)
        • SQL (31)
        • NoSQL (2)
        • JPQL (9)
        • QueryDSL (12)
        • Basic (4)
        • Firebase (4)
      • ⚙️ Ops (57)
        • CS (6)
        • AWS (9)
        • Docker (8)
        • Kubernetes (13)
        • MSA (1)
        • CI & CD (20)
      • 📚 Data Architect (48)
        • Data Structure (10)
        • Algorithm (8)
        • Programmers (17)
        • BaekJoon (5)
        • CodeUp (4)
        • Design Pattern (4)
        • AI (0)
      • ⚒️ Management & Tool (8)
        • Git (7)
        • IntelliJ (1)
      • 📄 Document (10)
        • Project 설계 (6)
        • Server Migration (3)
      • 📄 책읽기 (2)
        • 시작하세요! 도커 & 쿠버네티스 (2)
      • 🎮 Game (4)
        • Stardew Vally (1)
        • Path of Exile (3)
  • 블로그 메뉴

    • 링크

      • Github
    • 공지사항

    • 인기 글

    • 태그

      GStreamer #Pipeline
      Lock #Thread #Concurrency
      React #Markdown
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.0
    신건우
    CronTab - Application Health Check
    상단으로

    티스토리툴바

    단축키

    내 블로그

    내 블로그 - 관리자 홈 전환
    Q
    Q
    새 글 쓰기
    W
    W

    블로그 게시글

    글 수정 (권한 있는 경우)
    E
    E
    댓글 영역으로 이동
    C
    C

    모든 영역

    이 페이지의 URL 복사
    S
    S
    맨 위로 이동
    T
    T
    티스토리 홈 이동
    H
    H
    단축키 안내
    Shift + /
    ⇧ + /

    * 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.