클라우드/BashShell

웹서버 트러블의 재발 방지를 위한 쉘 스크립트 1

고고잉 2023. 3. 4. 23:51

같은 문제가 발생하지 않도록 감시 스트립트를 만들기

기초지식
- 쉘스크립트 작서의 흐름
- 실행 후 얻을 결과를 구체적으로 결정
- 결과를 얻기 위해 필요한 과정을 나열
- 각 과정별 명령어들 나열
- 명령어를 순서대로 파일에 써주고 실행
- 명령어
- df -h
- du -sk :킬로바이트 단위로 표시
-sh : 킬로바이트 메가바이트 등 사람이 읽기 쉽게 표시
- crontab
-e : 스케쥴 수정
-r : 스케쥴 완전 삭제
분 시간 일 월 요일 실행할프로그램
00    *     *    *    *     shellscript.sh       -> 정각마다 서버가 꺼질때까지 계속 실행
- awk 응용
첫번째 세로줄만 출력 (구분자는 디폴트로 공백)
awk '{print $1}' txt13
첫번째 세로줄만 출력 (구분자가 :으로 되어있음)
awk -F: '{print$1}' colon_txt13
구분자 텝으로 변경(column -t)
df -h | awk '{print $1, $2, $3, $4, $5, $6}' | column -t

%를 $로 변경
df -h | awk '{gsub("바꿀문자","바뀔문자"); print $5}'
df -h | awk '{gsub("%","$"); print $5}'

작업흐름
발생한 문제를 정리
- 대량의 접속자로 로그 용량이 폭주
- 그 결과 디스크 풀


각 문제 별 처리 스크립트
로그 디렉토리 용량 감시 스크립트
- 스크립트가 해야 할 일
- 로그 디렉토리의 크기를 확인하고 지정한 용량보다 크면 관리자에게 알림을 보냄
- 처리 과정의 정리 및 명령어
- 로그 디렉토리의 크기를 확인 (du)
- 크기를 비교해서 처리 (if)
- 관리자에게 알림
- mail / slack / telegram
(실습으로 telegram 사용)
- 스크립트 작성
- 테스트

vi log_mon.sh

#!/bin/bash

#1. 로그 디렉토리의 크기를 확인
#2. 크기가 1기가 이상일 경우 관리자에게 알림
#3. 1기가 미만일 경우 아무것도 안함
SIZE=$(du -m /var/log/nginx | awk '{print $1}') <-- m을 사용하여 메가바이트로 디렉토리 크기 통일
echo ${SIZE}

if [ ${SIZE} -ge 1024 ]
then
echo "여기의 관리자에게 알리는 코드가 들어갑니다."
else
echo "여기에서는 아무것도 안해요."

텔레그램 메세지 봇 만들기


토큰값은 내가 만든 봇에 접근 가능하기 때문에 공개되어서는 안돼서 가림



vi log_mon.sh

#!/bin/bash
DIR="/var/log/nginx"
SIZE="$(du -m ${DIR} | awk '{print $1}')"
HOST="$(hostname)"

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

vi tel_push.sh

#!/bin/bash

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

##파라미터확인
if [ $# -ne 2 ]
then
  echo 
  echo "$0 {HOSTNAME} {MESSAGES}"
  echo
  echo "example)"
  echo "$0  \"cent1 \"  \"/var/log/nginx 파티션을 확인하세요 \""
 echo
 exit 0
fi

##텔레그램 봇 관련정보
ID="nnnn"
API_TOKEN="nnnnnnnnn:xxxxxxxxxxxxxx"
URL="https://apitelegram/org/bot${API_TOKEN}/sendMessage"

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

##보낼 메세지 작성
TEXT="${DATE}" [$1]  $2

##메세지 보내기
curl -s -d "chat_id=$ {ID}&text=${TEXT}" ${URL} > /dev/null 

 

참고사항
$(소괄호)는 괄호안의 명령어를 실행한다는 의미
${중괄호}는 변수명으로 인식