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