본문 바로가기
Shell Script/Resource Monitoring

(Shell Script) 서버 리소스 사용량 모니터링

by 미니몬 2023. 7. 22.

목차

    728x90
    반응형

    Summary

    오늘은 리눅스 서버의 자원 사용량을 모니터링 하는 스크립트를 만들어 볼까 합니다. CPU와 메모리 사용량을 주기적으로 체크하고, 일정 임계값을 넘어설 경우 알림을 주는 스크립트를 만들어 서버의 리소스를 사용량을 감시하도록 해봅시다.

     

     

    스크립트 작성 및 설명

    1) 알람이 발생되는 임계치를 지정합니다 :

    # CPU, 메모리 임계치 설정
    CPU_THRESHOLD=75.0
    MEMORY_THRESHOLD=80.0

     

     

    2) 서버 리소스 사용량을 확인합니다 : 

    # CPU 사용량 확인
    CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}')
    
    # 메모리 사용량 확인
    MEMORY_USAGE=$(free | grep Mem | awk '{print $3/$2 * 100.0}')

     DATE 변수는 'YYYYMMDD' 형식의 현재날짜 데이터를 저장하게 됩니다.

     

     

    3) 사용량이 임계치보다 높은 경우 경고 메시지를 출력합니다 : 

    # CPU 사용량이 임계치를 초과할 경우 경고 메시지 출력
    if (( $(echo "$CPU_USAGE > $CPU_THRESHOLD" |bc -l) )); then
      echo "[`date '+%Y/%m/%d %H:%M:%S'`] Warning: CPU usage is over $CPU_THRESHOLD%! Currently, CPU usage is $CPU_USAGE%."
    else
      echo "[`date '+%Y/%m/%d %H:%M:%S'`] CPU Usage is $CPU_USAGE%"
    fi
    
    # 메모리 사용량이 임계치를 초과할 경우 경고 메시지 출력
    if (( $(echo "$MEMORY_USAGE > $MEMORY_THRESHOLD" |bc -l) )); then
      echo "[`date '+%Y/%m/%d %H:%M:%S'`] Warning: Memory usage is over $MEMORY_THRESHOLD%! Currently, Memory usage is $MEMORY_USAGE%."
    else
      echo "[`date '+%Y/%m/%d %H:%M:%S'`] MEMORY Usage is $MEMORY_USAGE%"
    fi

     리눅스에서 기본적으로 제공하는 수식 계산 패키지인 'bc' 명령을 사용해서  임계치를 넘은 경우 경고 메시지를 출력합니다. 

     - bc 명령에 대한 설명

     

     - date 명령에 대한 설명

     

     

     

    전체 스크립트

    아래는 CPU와 Memory 의 사용량을 모니터링 하다가 일정 수치를 넘은 경우

    경고 메시지를 출력하는 스크립트 전체 내용입니다.

    #!/bin/bash
    
    # CPU, 메모리 임계치 설정
    CPU_THRESHOLD=75.0
    MEMORY_THRESHOLD=80.0
    
    # CPU 사용량 확인
    CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}')
    
    # 메모리 사용량 확인
    MEMORY_USAGE=$(free | grep Mem | awk '{print $3/$2 * 100.0}')
    
    # CPU 사용량이 임계치를 초과할 경우 경고 메시지 출력
    if (( $(echo "$CPU_USAGE > $CPU_THRESHOLD" |bc -l) )); then
      echo "[`date '+%Y/%m/%d %H:%M:%S'`] Warning: CPU usage is over $CPU_THRESHOLD%! Currently, CPU usage is $CPU_USAGE%."
    else
      echo "[`date '+%Y/%m/%d %H:%M:%S'`] CPU Usage is $CPU_USAGE%"
    fi
    
    # 메모리 사용량이 임계치를 초과할 경우 경고 메시지 출력
    if (( $(echo "$MEMORY_USAGE > $MEMORY_THRESHOLD" |bc -l) )); then
      echo "[`date '+%Y/%m/%d %H:%M:%S'`] Warning: Memory usage is over $MEMORY_THRESHOLD%! Currently, Memory usage is $MEMORY_USAGE%."
    else
      echo "[`date '+%Y/%m/%d %H:%M:%S'`] MEMORY Usage is $MEMORY_USAGE%"
    fi

     

     

    Crontab 등록하여 자동으로 실행

    이렇게 만든 스크립트를 주기적으로 실행하여 모니터링을 진행하도록 하려면

    Cron 기능을 이용해서 원하는 주기를 설정하면 됩니다.

    아래는 매 5분마다 실행하도록 설정합니다.

     

    1) 터미널에서 `crontab -e` 명령을 입력합니다

    2) 아래와 같이 입력 후 저장합니다

    */5 * * * * /path/to/your/script.sh

    마지막으로, `chmod +x /path/to/your/script.sh` 명령으로 스크립트의 실행 권한을 부여 합니다.

     

     

    만약 실행 결과를 리다이렉션 기능을 통해 파일로 관리하고자 한다면 아래와 같이 설정할 수 있습니다.

    # 표준에러 무시
    */5 * * * * /path/to/your/script.sh >> /path/to/your/log 2>&1
     or
    
    # 표준 에러 파일에 로깅
    */5 * * * * /path/to/your/script.sh >> /path/to/your/log 2>/path/to/your/error.log

     

    이렇게 하면 스크립트의 실행 결과를 화면에 출력하지 않고, 파일에 로깅할 수 있습니다.

    그리고 2>&1 부분이 표준 에러 출력(stderr, 2에 해당)을 표준 출력(stdout, 1에 해당)으로 리다이렉션하는 역할을 하므로, 표준 에러 메시지를 무시할 수 있습니다. 추가로  표준 에러 로그도 확인이 필요한 경우 파일에 기록할 수 있습니다.

     

     

    이상으로 서버 자원 사용량을 모니터링하는 스크립트를 만들고 주기적으로 실행하는 방법에 대해 알아보았습니다.

    임계치 및 실행 주기를 원하는 값으로 자유롭게 수정하여 사용할 수 있으며,

    출력결과와 경고 메시지 또한 파일로 리다이렉션 하여 관리할 수 있습니다.

     

    728x90
    반응형