Profile picture

[Shell Script] cpu / memory / disk 사용량 모니터링 스크립트 작성하기

JaehyoJJAng2023년 05월 25일

1. 스크립트 작성

  • 간단하게 CPU / Memory / Disk 사용량을 로그 형태의 파일로 저장한다.
  • 10초 주기로 서버의 상태를 모니터링 한다.

status.sh

#!/usr/bin/bash

function cpuCheck() {
  # CPU 사용률 계산
  cpu_usage=$(top -b -n1 | grep -Po '[0-9.]+ id' | awk '{print 100-$1}')

  # CPU 소수점 반올림
  cpu_usage=$(printf %.0f ${cpu_usage})

  # int로 형변환
  cpu_usage=$(( ${cpu_usage} * 1 ))

  if [[ ${cpu_usage} -ge 90 ]]
  then
    echo -n " [CPU(${cpu_usage})% - 심각]" | tee -a ${today}
  elif [[ ${cpu_usage} -ge 70 ]]
  then  
    echo -n " [CPU(${cpu_usage})% - 주의]" | tee -a ${today}
  else
    echo -n " [CPU(${cpu_usage})% - 양호]" | tee -a ${today}
  fi
}

function memoryCheck() {
  memory_total=$(free | grep "^Mem" | awk '{print $2}')
  memory_used=$(free | grep "^Mem" | awk '{print $3}')
  memory_percent=$(( (100 * ${memory_used}) / ${memory_total} ))

  if [[ ${memory_percent} -ge 90 ]]
  then
    echo -n " [Memory(${memory_percent})% - 심각]" | tee -a ${today}
  elif [[ ${memory_percent} -ge 70 ]]
  then
    echo -n " [Memory(${memory_percent})% - 주의]" | tee -a ${today}
  else
    echo -n " [Memory(${memory_percent})% - 양호]" | tee -a ${today}
  fi
}

function diskCheck() {
  # Disk block summary
  disk_total=$(df -P | grep -v "^Filesystem" | awk '{sum += $2} END { print sum; }')

  # Disk used
  disk_used=$(df -P | grep -v "^Filesystem" | awk '{sum += $3} END { print sum; }')

  # Disk percent
  disk_percent=$(( (100 * ${disk_used}) / ${disk_total} ))

  if [[ ${disk_percent} -ge 80 ]]
  then
    echo -n " [Disk(${disk_percent})% - 심각]" | tee -a ${today}
  elif [[ ${disk_percent} -ge 70 ]]
  then
    echo -n " [Disk(${disk_percent})% - 주의]" | tee -a ${today}
  else
    echo -n " [Disk(${disk_percent})% - 양호]" | tee -a ${today}
  fi
}

while true;
do
  today=$(date "+%Y-%m-%d").txt # 날짜로 파일명 생성
  today_format="$(date) -"
  
  echo -n "${today_format}" | tee -a ${today}
  cpuCheck
  memoryCheck 
  diskCheck

  echo "" >> ${today}
  echo "" >> ${today}
  echo 

  sleep 10 # 10초 대기
done

2. 스크립트 설명

cpuCheck() 함수

cpu_usage=$(top -b -n1 | grep -Po '[0-9.]+ id' | awk '{print 100-$1}')
top -b: 배치모드로 top 명령어 실행. 이는 top이 한 번만 실행되고 즉시 종료되도록 함.
top -n1: 한 번만 top을 실행하도록 지정
grep -Po '[0-9.]+ id: top 명령어의 출력 중에서 숫자와 소수점으로 이루어진 패턴인 '[0-9.]+'을 찾아서 출력함. 이 패턴은 CPU 사용률 중 idle(유휴) 상태인 부분을 나타냄.
awk '{print 100-$1}': 앞서 출력된 idel 상태의 백분율을 찾은 후 그 값을 사용하여 CPU 사용률을 계산. 즉 100에서 이전 파이프라인에서 출력된 idle 상태의 사용률을 뺀 값을 출력함.

diskCheck() 함수

disk_total=`df -P | grep -v "^Filesystem" | awk '{sum += $2} END { print sum; }'`
grep -v "^Filesystem": Filesystem 행 제외 후 출력
awk '{sum += $2} END { print sum; }': sum 변수에 각 행의 2번째 열에 해당하는 값을 합산 후 출력
  - awk '{sum += $2}': 각 행의 세 번째 열 값을 누적하여 합산
  - END { print sum; }: 파일을 모두 읽은 후 누적된 값 출력

3. 스크립트 생성

1. touch 명령으로 스크립트 파일 생성

$ touch status.sh

2. vi,vim 편집기 사용하여 위에 작성한 스크립트 내용 붙여넣기

$ vi status.sh

3. 스크립트에 실행권한 부여

$ chmod 700 status.sh

2. 실행

스크립트를 백그라운드로 실행

# 터미널 종료 시 스크립트도 같이 종료 됨
$ bash status.sh &

# 터미널이 종료되어도 스크립트 유지
$ nohup bash status.sh 1>log.out 2>&1 &

# nohup.out 파일을 생성하지 않으려면 다음과 같이 실행
$ nohup bash status.sh 1>/dev/null 2>&1 &

3. 종료

ps, kill 명령어를 이용해 프로세스 종료

# PID 찾기
$ ps -ef | grep 'status.sh' | grep -v 'grep' | awk '{print $2}'
17427

# PID 찾은 후 바로 종료
$ kill -KILL $(ps -ef | grep 'status.sh' | grep -v 'grep' | awk '{print $2}')
[1]+  죽었음               nohup bash status.sh > /dev/null 2>&1

Loading script...