티스토리 뷰

[Shell Script] Backup Shell Script


  대규모 IDC 근무하며 스위치 Config 백업은 필수다. 필자는 일전에 만들어 놓은 switch 백업 java 프로그램을 리눅스 백업서버에서 cron으로 자동동작하도록 shell script로 만들어 준 후, 텔레그램으로 백업결과를 오전 8시에 받고 있다. 이 포스팅은 switch 백업 java 프로그램을 실행하는 shell script 이다. switch config backup java 프로그램은 아래 링크를 참조 바란다.


1. 2017/12/14 - [Programming/JAVA] - [JAVA] Switch Config Backup Program



  기본적인 백업 쉘 스크립트 구조이다. (사실은 더 정교하지만 간략하게 짜보았다,)


#!/bin/bash

cd /home/Backup



# Before Backup, Clear remained class file. Because The human can edit ConfigBackup.java File. In this script Line 15~16 means restructing Class using ConfigBackup.java.



rm -f /home/Backup*.class

# If Backuping file remains, Backup is running now.



touch Backuping

# If log file and RunTimeLog directory doesn't exist, create now.

if test ! -f "Backup.log";then

        touch Backup.log

fi

if test ! -d "/home/BackupRunTimeLog";then

        mkdir /home/BackupRunTimeLog

fi



# Backup Starting!!

echo "Start..." >> Backup.log

javac -cp ".:/home/Backuplib/commons-net-3.5.jar" ConfigBackup.java

java -cp ".:/home/Backuplib/commons-net-3.5.jar" ConfigBackup > /home/BackupRunTimeLog/Running_$(date '+%Y.%m.%d_%H:%M')



# drop cache memory after java running

sudo echo 3 > /proc/sys/vm/drop_caches 



# Create Backup log

echo "Complete...$(date '+%Y.%m.%d_%H:%M')" >> Backup.log

echo "[$(date '+%Y-%m-%d')] Not Backuped Switch List. Check!!" >> Backup.log

echo "Total $(ls -lSh /home/BACKUP/$(date '+%Y-%m-%d') | wc -l) Switch Backuped." >> Backup.log

ls -lSh /home/BACKUP/$(date '+%Y-%m-%d') | awk '{if($5==0) print}' | awk '{print $(NF)}' | awk -F '.' '{print $1}' >> Backup.log; echo "" >> Backup.log



rm -f *.class

rm -f Backuping 

exit 0


기본적인 동작과정은 아래와 같다.


1. 백업 시작 전 /home/Backup 디렉토리 내 .class 파일 삭제

cd /home/Backup

# Before Backup, Clear remained class file. Because The human can edit ConfigBackup.java File. In this script Line 15~16 means restructing Class using ConfigBackup.java.

rm -f /home/Backup*.class


2. 백업이 진행되는 동안 백업중임을 알기 위해 Backuping 파일을 새로 생성한다.

# If Backuping file remains, Backup is running now.

touch Backuping


3. Backup.log 가 없다면 Backup.log 파일을 만듦 / BackupRunTimeLog 디렉토리가 없다면 새로 만듦.

# If log file and RunTimeLog directory doesn't exist, create now.

if test ! -f "Backup.log";then

        touch Backup.log

fi

if test ! -d "/home/BackupRunTimeLog";then

        mkdir /home/BackupRunTimeLog

fi


4. 백업이 시작되며 /home/Backup/lib/commons-net-3.5.jar 외부 라이브러리를 import 하여 ConfigBackup.java java 파일의 클래스를 생성한 후, 백업 과정 중 발생하는 모든 메시지를 /home/BackupRunTimeLog/Running_$(date '+%Y.%m.%d_%H:%M') 에 기록한다.

# Backup Starting!!

echo "Start..." >> Backup.log

javac -cp ".:/home/Backuplib/commons-net-3.5.jar" ConfigBackup.java

java -cp ".:/home/Backuplib/commons-net-3.5.jar" ConfigBackup > /home/BackupRunTimeLog/Running_$(date '+%Y.%m.%d_%H:%M')


5. 프로그램이 실행된 후, cache 메모리를 비운다. (root 권한 필요!)

# drop cache memory after java running

sudo echo 3 > /proc/sys/vm/drop_caches --> moved to root crontab(every day 4:00)


6. 백업 로그를 생성한다. ( 여기서 switch config backup이 저장되는 경로는 /home/BACKUP/$(date '+%Y-%m-%d') 이다. )

# Create Backup log

echo "Complete...$(date '+%Y.%m.%d_%H:%M')" >> Backup.log

echo "[$(date '+%Y-%m-%d')] Not Backuped Switch List. Check!!" >> Backup.log

echo "Total $(ls -lSh /home/BACKUP/$(date '+%Y-%m-%d') | wc -l) Switch Backuped." >> Backup.log

ls -lSh /home/BACKUP/$(date '+%Y-%m-%d') | awk '{if($5==0) print}' | awk '{print $(NF)}' | awk -F '.' '{print $1}' >> Backup.log; echo "" >> Backup.log


7. 백업과정 중 생성된 *.class 파일을 삭제한다.

rm -f *.class


8. 백업중임을 알기 위해 생성된 Backuping 파일을 삭제한다.

rm -f Backuping




자, 이제 위 백업 스크립트에 실행권한을 부여하자.
chmod 700 Backup.sh

그런 다음 cron에 자동 동작하도록 등록해주면 끝~ 필자는 오전 3시에 돌도록 크론을 등록해놓았다.

00 3 * * * /home/Backup/Backup.sh > /dev/null 2>&1



!! 당연히 cron이 실행중이어야 겠쥬?


cron이 돌고 나면 아래와 같이 log가 쌓일 것이다.

# tail Backup.log

Start...

Complete...2018.06.19_03:04

[2018-06-19] Not Backuped Switch List. Check!!

Total 116 Switch Backuped.

SA-20-01

SB-11-21

VIP-04-L3-VM



* /home/Backup 디렉토리에는 평소 아래와 같이 파일/디렉토리가 존재할 것이다.

-rw-rw-r-- 1 Backup Backup 2.3K  6월 19 03:04 Backup.log

-rwx------ 1 Backup Backup 1.6K  6월  7 11:01 Backup.sh*

-rw-rw-r-- 1 Backup Backup  21K  6월  7 10:34 ConfigBackup.java

drwxrwxr-x 2 Backup Backup 4.0K  6월 19 03:00 RunTimeLog/

drwxrwxr-x 2 Backup Backup 4.0K 12월 11  2017 lib/



여기서 의아한 것이 아래 Line일 것이다. ConfigBackup.java 에서 switch backup본이 저장되는 경로가 /home/BACKUP/$(date '+%Y-%m-%d') 디렉토리이고, 스위치 어레이 중 switch 접속이 안되거나 다른 이유로 백업이 불가하여 백업이 제대로 이루어지지 않은 switch의 파일 크기가 0으로 남는다. 이를 이용해 백업이 이뤄지지 않은 switch를 파악하여 Backup.log에 찍어 준다.

ls -lSh /home/BACKUP/$(date '+%Y-%m-%d') | awk '{if($5==0) print}' | awk '{print $(NF)}' | awk -F '.' '{print $1}' >> Backup.log; echo "" >> Backup.log



텔레그램을 이용해서 백업 결과를 알람으로 받아보길 원한다면 아래 참조!

3. 2018/06/19 - [Programming/Python] - [Python] Telegram Bot을 이용한 백업결과 전송


댓글