본문 바로가기

Linux

웹 로그가 쌓여 디스크 꽉 차서 더 이상 로그를 생성하지 못하는 문제

0. 문제 상황

웹서버 접속자 급증으로 웹 로그가 급증, 디스크 풀 발생.

디스크 풀로인해 다른 작업을 진행하지 못함.

1. 먼저 용량을 차지하는 디렉토리를 찾기

  • / (root)로 이동하고
  • du -h --max-depth=1 | grep G (/에서 한단계 아래 깊이 디렉토리 별 저장 사용률을 출력 G단위 큰 디렉토리만 출력하기)

  • du를 통해 찾아보니, /var/log/nginx/VWS.access.log가 파일에 로그가 계속 쌓여 디스크를 다 차지한다는 것을 발견
  • 삭제하여 임시적 조치 완료하기

df 명령어와 du 명령어의 차이는 아래 글 참고

df 명령어는 리눅스 시스템 전체의 디스크 사용량을 확인 / du 명령어는 특정 디렉토리를 기준으로 디스크 사용량을 확인

df, du 명령어 차이점과 차이 발생 시 해결방법

2. 로그 디렉토리 용량 감시 스크립트

위 방법은 일시적을 현재 문제를 해결한 것이고, 추후에도 이런 문제가 발생하지 않게, /var/log/nginx의 용량이 급격히 커지게 되면 텔레그램을 통해 알림을 받을 수 있는 스크립트 작성 작업을 진행

telegram fatherbot을 활용해 리눅스에서 메세지를 보내는 스크립트

$0은 스크립트 이름

$# 입력받은 파라미터 숫자

$1 첫 번째 파라미터

#! /bin/bash

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

#파라미터 확인
if [ $# -ne 2 ]
then
        echo
        echo "Usage"
        echo "$0 {HOSTNAME} {MESSAGE}"
        echo
        echo "example) "
        #\\는 "를 출력하기 위한것"
        echo "$0 \\"cent1\\" \\"/var/log/nginx 파티션을 확인하세요\\""
        echo
        exit 0
fi

#teltegram bot info
ID="~~~"
API_TOKEN="~~~"
URL="<https://api.telegram.org/bot${API_TOKEN}/sendMessage>"

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

#writing message
TEXT="${DATE} [$1] $2"

#sending message
curl -s -d "chat_id=${ID}&text=${TEXT}" ${URL} > /dev/null

/var/log/nginx가 1기가 넘으면 메세지 보내는 스크립트

#! /bin/bash

#하는 일: 로그 디렉토리 용량을 감시
#1. 로그 디렉토리의 크기를 확인
#2. 크기가 1기가 이상인 경우 관리자에게 알림니다.
#3. 1기가 미만인 경우 아무 것도 안함

#disk size 메가바이트 단위로 출력 -m 옵션
SIZE=$(du -m /var/log/nginx | awk '{print $1}')
DIR="/var/log/nginx"
HOST="$(hostname)"

#if [ ${SIZE} -ge 1024 ]
if [ ${SIZE} -ge 1 ]
then
        TEXT="${DIR} 사용량이 1기가 넘었습니다."
        /home/vagrant/telegram_send.sh "${HOST}" "${TEXT}"
fi

3. 디스크 파티션 사용량 감시

어떤 파티션이 몇 퍼센트 이상 차 있습니다라고 텔레그램 메세지 보내기.

df -u 명령어를 통해 얻을 수 있는 정보에서 awk를 통해서 80이상의 use와 mount 정보를 가져오기

#! /bin/bash

# 파티션별 사용량을 확인해서 80% 이상인 파티션이 있으면 관리자에게 메시지를 보냄
# 1. 파티션별 사용량을 확인
# 2. 크기를 비교해서 처리
# 3. use가 80%이상이면 관리자에게 메세지
# 4. 80% 미만이면 아무것도 안함

#TEXT 변수에 보낼 메세지를 작성
#  grep -v "^[A-Z]" 는 대문자로 시작하는 문자열 제외 Mounted 행 제외
TEXT="$(df -h | \\
        awk '{
                gsub("%", "");
                USE=$5;
                MNT=$6;
                if ( USE > 10 )
                        print MNT, "파티션이" , USE "%를 사용 중입니다."
                }' | \\
        grep -v "^[A-Z]")"
HOST="$(hostname)"

# 80%이상디스크를 상요하는 파티션이 있을 경우
# TEXT 변수의 내용을 관리자에게 보냄
# $(#TEXT)는 변수의 사이즈를 구함
if [ ${#TEXT} -gt 1 ]
then
        /home/vagrant/telegram_send.sh "${host}" "${TEXT}"
fi

마지막으로 crontab으로 1시간 마다 실행 되도록 등록해주면 된다.

'Linux' 카테고리의 다른 글

데이터 베이스 서버 백업 쉘스크립트  (1) 2024.06.07
서버 장애 발생 시 확인해야 할 기본 절차  (1) 2024.06.07
파일관련 명령어 2  (0) 2024.05.08
파일관련 명령어 1  (0) 2024.05.07
CLI 편집기 vim  (0) 2024.05.04