Profile picture

웹 서버 트러블슈팅 #2 - 웹 로그 디렉토리 용량 감시

JaehyoJJAng2023년 02월 23일

◾️ 작업 흐름

  • 발생한 문제 정리

    • 각 문제별 처리 스크립트
    • 로그 디렉토리 용량 감시 스크립트
    • 디스크 파티션 사용량 감시 스크립트
  • 시나리오

    • 같은 문제가 발생하지 않도록 감시 스크립트 생성
  • 기초지식

    1. 실행 후 얻을 결과 구체적으로 결정
    2. 결과 얻기 위해 필요한 과정 나열
    3. 각 과정별 명령어 나여
    4. 명령어 순서대로 파일에 써 주고 실행

◾️ 사용할 명령어

▪️ df

df -h
df -k

▪️ du

du -sh ./* | grep 'G'
du -h --max-depth=1 | grep 'G'

▪️ crontab

분 시간 일 월 요일 실행할프그램
*   *   *  *    *   shellscript.sh # 매 분 shellscript.sh 실행
00  *   *  *    *   shellscript.sh # 매 시 정각에 shellscript.sh 실행
00  12  *  *    *   shellscript.sh # 12시 정각마다 shellscript.sh 실행
00  12  *  *    7   shellscript.sh # 매 일요일 12시 정각에 shellscript.sh 실행

▪️ awk 응용 (1)

# /etc/passwd에서 web 유저 찾기
$ cat /etc/passwd | awk -F':' '{print $1}' | grep "web"
web
# 파일 이름만 출력하기
$ ls -alh | awk '{print $9}'
.
..
.bash_history
.bash_logout
.bash_profile
.bashrc
.ssh
.viminfo
disk-full
wordpress
# ':' 을 기준으로 나눈 후 3번째 필드 데이터 뽑아오기 (/etc/passwd 파일에서 유저명만 뽑아옴 )
$ awk -F ':' '{print $1}' /etc/passwd | head -n 5
# df -h 에서 Filesystem 이름과 사용량 추출한 후 각 컬럼을 탭으로 구분하기
$ df -h | awk '{print $1 , $5}' | column -t
Filesystem  Use%
devtmpfs    0%
tmpfs       0%
tmpfs       1%
tmpfs       0%
/dev/sda3   100%
/dev/sda1   1%
tmpfs       0%

▪️ awk 응용 (2)

  • gsub 내장함수 사용
$ df -h | awk '{gsub("바꿀문자","바뀔문자"); print $필드지정1 , $필드지정2 }' | column -t
# df -h 에서 Filesystem 이름과 사용량 추출 한 후 탭으로 구분
# awk로 구분된 데이터에서 '%' 는 '' 빈 값으로 반환
$ df -h | awk '{gsub("%",""); print $1 , $5}' | column -t
Filesystem  Use
devtmpfs    0
tmpfs       0
tmpfs       1
tmpfs       0
/dev/sda3   100
/dev/sda1   1
tmpfs       0

gsub 함수를 사용하여 '%' 스트링을 없애면 셸 스크립트에서 디스크 사용량 관련 연산 로직을 구현할 수 있게 된다.


◾️ 셸 스크립트 작성

awk 함수를 활용하여 웹 서버의 로그 디렉토리 용량 감시 셸 스크립트를 작성해보도록 하자.
그리고 텔레그램 봇으로 알림까지 보내주는 셸 스크립트를 작성하여 두 셸 스크립트를 연동해보는 작업까지 해볼 것이다.


스크립트가 해야할 일

  • 로그 디렉토리의 크기를 확인하고 지정한 용량보다 크면 관리자에게 알림

처리 과정의 정리 및 명령어

  • 로그 디렉토리의 크기 확인 (du 명령어)
  • 크기 비교해서 처리 (if)
  • 관리자에게 알림 (mail,slack,telegram)

▪️ 로그 감시 스크립트

#!/usr/bin/bash
#===================================================
# //// 스크립트 용도 : 로그 디렉토리의 용량을 감시 /////
#===================================================

# 검사할 디렉토리 지정
DIR="/var/log/nginx"

# 1. 로그 디렉토리의 크기를 확인

SIZE="$(du -m ${DIR} | awk '{print $1}')"
HOST="${HOSTNAME}"
TEL_FILE="/home/${USER}/telegram/alarm.sh"

# 2. 크기가 1기가 이상일 경우 관리자에게 알림
if [[ "${SIZE}" -ge 1024 ]]; then # 1기가 이상인 경우 관리자에게 알림 보냄
        TEXT="${DIR} 사용량이 1GB가 넘었습니다"
        "${TEL_FILE}" "${HOST}" "${TEXT}"
fi

▪️ 텔레그램 봇 연동

  1. 텔레그램 봇 생성
  2. 텔레그램 API_TOKEN 값 획득
  3. 그룹 또는 개인 메시지로 봇에 메시지 전송
  4. https://api.telegram.org/bot[Token값]/getUpdates 페이지에서 Chat_id 획득
# telegram/alarm.sh

#!/usr/bin/bash

## telegram bot으로 메시지를 보내는 쉘 스크립트
## 2개의 파라미터 필요
## 파라미터가 두개가 안될 경우 사용방법을 출력하고 스크립트를 종료
## 1. 서버 호스트이름
## 2. 메세지
## 실행 결과는 현재 날짜/시각 , 서버이름 , 지정한 메세지를 텔레그램을 보냄

# 파라미터 확인하기
if [[ ${#} -ne 3 ]]; then
    clear
    echo -e "Usage\n${0} hostname message"
    echo -e "\nExam) ${0} web 안녕하세요!"
    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}"

# 메시지 보내기
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

Loading script...