시나리오
- 텔레그램으로 백업 레포팅이 도착하지 않은 것을 보고 서버에 접속해서 확인
- 디스크가 가득 차서 백업도 멈춰있고 서비스도 안되는 상황
- 다시 문제가 생긴 이유가 무엇일까?
기초지식
- 제한적인 쉘 스크립트 작성
: 옵션을 통해 쉘이 동작하는 방식을 제어, 버그를 줄일 수 있음
- set -exuo pipefail
- -e : errexit, 첫번째 실행 실패(exit코드가 0이아닌 상태로 종료하는 명령어)시 쉘 스크립트를 종료
- -x : xtrace, 매 라인을 실행하기 전에 필요한 산술확장, 매개변수확장, 명령치환 변수대입 등을 화면에 출력
- -u : nounset, 정의가 안된 변수를 사용하면 에러 메세지를 출력하고 쉘 프로그램 강제 종료
- -o : 옵션을 on/off할 수 있다.
- set -o [옵션명] :옵션 on
- set +o [옵션명] : 옵션 off
- pipefail : 옵션명, 파이프로 ㅇ ㅕㄴ결된 명령이 전부 true일 때만 true를 봔환하도록 함
vi web_backup.sh & db_backup.sh (cent1, 2)
#!/bin/bash
set -exuo pipefail <<-- cent1, 2 둘다 추가 , 완료 후 주석처리
##변수설정
HOST="$(/usr/bin/hostname)"
LOG="/root/backup.log"
PUSH="/root/SHELL/monitor/tel_push.sh"
DATE="$(/bin/date +%Y.%m.%d)"
##백업할 디렉토리 /파일을 지정
BAK_LIST="/etc/nginx /usr/share/nginx/html/www"
##백업 디렉토리
BAK_PATH="/mnt/BACKUP/${HOST}"
##백업파일명
BAK_FILE="${BAK_PATH} / ${DATE}_ ${HOST}.tgz"
##스토리지에 마운트
/usr/bin/mount /mnt
##로그파일 생성
/usr/bin/touch "${LOG}"
--- 생략 ---
##텔레그램으로 백업 로그를 전송
"${PUSH}" " ${HOST}" " $(/usr/bin/cat " ${LOG}")"
##로그파일 삭제
/usrr/bin/rm -f "{LOG}" "{DB_BAK_PATH}" <<-- db_backup.sh cent2 만 추가
트러블 재발 방지를 위한 처리
- 데이터베이스(cent2), 스토리지(cent3) 서버에도 디스크 감시 스트립트 실행
vi mnt_mon.sh
#!/bin/bash
하는 일 : /mnt 디렉토리의 용량을 감시
#1. /mnt 디렉토리의 크기를 확인
#2. 크기가 1기가 이상일 경우 관리자에게 알림
#3. 1기가 미만일 경우 아무것도 안함
DIR="/mnt"
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
저장후 scp 명령어를 이용하여 cent2로 복사
scp mnt_mon.sh cent2:/root/SHELL/monitor/
crontab에 등록하여 적용
디스크 감시 스크립트는 하루에 한번 백업이 끝난 이후 작동하도록함
1시간에 한번 하게 디스크감시 스크립트를 되면 안되는 이유는 백업 도중에는 스토리지를 마운트하고 있기 때문이다.
crontab -e
00 05 * * * /root/SHELL/BACKUP/monitor/mnt_mon.sh >/dev/null 2>$1
'클라우드 > BashShell' 카테고리의 다른 글
스토리지 서버 트러블 재발 방지를 위한 처리 쉘 스크립트 (0) | 2023.03.10 |
---|---|
스토리지 서버 트러블 슈팅 쉘 스크립트 (0) | 2023.03.09 |
백업 쉘 스크립트 3 (0) | 2023.03.06 |
백업 쉘 스크립트 2 (0) | 2023.03.06 |
백업 쉘 스크립트 1 (0) | 2023.03.05 |