Profile picture

웹 서버 트러블슈팅 #3 - 디스크 파티션 사용량 감시

JaehyoJJAng2023년 02월 24일

◾️ 셸 스크립트 작성

  • 스크립트가 해야할 일
    • 디스크 파티션 사용량 감시

▪️ 한 줄 스크립트

df -h | awk '{gsub("%",""); USE=$5;MNT=$6; print USE,MNT}' | column -t

df -h | awk '{gsub("%",""); USE=$5;MNT=$6; if ( USE > 80 ) print USE,MNT}' | column -t

df -h | awk '{gsub("%",""); USE=$5;MNT=$6; if ( USE >= 80 ) print USE,MNT}' | column -t | grep -v "^[A-Z]"

df -h | awk '{gsub("%",""); USE=$5;MNT=$6; if ( USE >= 80 ) print MNT,"파티션이 ",USE,"%를 사용중입니다" }' | grep -v "^[A-Z]"

▪️ 감시 스크립트 작성

# ./disk-monitoring.sh

#!/usr/bin/bash
function param_check() {
  if [[ ${#} -ne 1 ]]; then
	  clear
	  echo -e "해당 스크립트 사용방법\n${0} percentage"
	  echo -e "\nExample) ${0} 50"
	  exit 1
  fi
}

function validation_check() {
  if [[ ${1} -gt 100 ]] || [[ ${1} -lt 0 ]]; then
    echo -e "퍼센트 수치가 너무 높거나 낮습니다. 1 ~ 100 사이에서 입력하세요."
    exit 1
  fi

  if [[ ${1} =~ [^0-9] ]]; then
    echo -e "숫자만 입력!"
    exit 1
  fi
}

# Check Params
param_check ${1}

# Percentage
PER=${1}

# PER validation check
validation_check ${PER}

#### Required Variables
TEL_FILE="/home/${USER}/telegram/alarm.sh"
HOST_NAME="${HOSTNAME}"
#

#### disk usage
DISK_USAGES=( $(df -h | grep -v "Filesystem" | awk '{gsub("%",""); print $5}') )
MNT_PATH=( $(df -h | grep -v "Filesystem" | awk '{print $6}') )

for idx in "${!DISK_USAGES[@]}"; do
    DISK_USAGE="${DISK_USAGES[${idx}]}"
    MOUNT="${MNT_PATH[${idx}]}"
    echo ${MOUNT}

    if [[ ! "${DISK_USAGE}" -ge "${PER}" ]]; then
        continue
    else
        TEXT="디스크 사용량이 ${DISK_USAGE}% 까지 올랐습니다! 서버에 접속하여 확인해주세요."
        echo "${TEXT}"
        "${TEL_FILE}" "${HOST_NAME}" "${MOUNT}" "${TEXT}"
    fi
done
#

▪️ 텔레그램 봇 연동

# telegram/alarm.sh

#!/usr/bin/bash

# 서버 호스트 이름
# 텔레그램 보낼 메시지
# 파라미터 확인하기

# 파라미터 확인하기
if [[ ${#} -ne 3 ]]; then
    clear
    echo -e "Usage\n${0} hostname mount_path text"
    echo -e "\nExam) ${0} web /mnt '디스크 사용량을 확인해주세요.'"
    exit 1
fi

# 텔레그램 봇 관련 정보
TELE_INFO_FILE="/home/${USER}/telegram/.telegram.info"
TELE_INFOS=( $(awk -F '=' '{print $2}' "${TELE_INFO_FILE}" ) )
CHAT_ID="${TELE_INFOS[0]}"
API_TOKEN="${TELE_INFOS[1]}"
URL="https://api.telegram.org/bot${API_TOKEN}/sendMessage"

# 날짜
DATE="$(date +'%Y-%m-%d %H:%M')"

# 보낼 메시지 작성
TEXT="${DATE}
${1} :: ${2} ${3}"

# 메시지 보내기
curl -s -d "chat_id=${CHAT_ID}&text=${TEXT}" ${URL} > /dev/null # 출력 결과는 필요없기 때문에 표준출력에 대해 /dev/null로 보냄
# /home/${USER}/telegram/telegram.info

CHAT_ID=1002XXXXX
TOKEN=66XXXX:XXXXXX

▪️ crontab 등록

# 로그 디렉토리 감시 스크립트
00 * * * * /root/diskusage_monitor/log_mon.sh >/dev/null 2>&1

# 디스크 파티션 감시 스크립트
30 * * * * /root/part_monitor/part_mon.sh 70  >/dev/null 2>&1

💥 리다이렉션?
/dev/null : 표준 출력 /dev/null로 보냄 (쓰레기통)
2>&1 : 표준 에러를 표준 출력으로 변환


Loading script...