0. 문제 상황
웹서버 접속자 급증으로 웹 로그가 급증, 디스크 풀 발생.
디스크 풀로인해 다른 작업을 진행하지 못함.
1. 먼저 용량을 차지하는 디렉토리를 찾기
- / (root)로 이동하고
- du -h --max-depth=1 | grep G (/에서 한단계 아래 깊이 디렉토리 별 저장 사용률을 출력 G단위 큰 디렉토리만 출력하기)
- du를 통해 찾아보니, /var/log/nginx/VWS.access.log가 파일에 로그가 계속 쌓여 디스크를 다 차지한다는 것을 발견
- 삭제하여 임시적 조치 완료하기
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 |