Posts Tagged 'backup'

Quick backup

수치해석을 위한 프로그래밍을 주로 하는 제 경험상 프로그램들을 크게 수정하기 전후로 backup을 해야겠는데 CVS, Subversion, Git과 같은 version관리 프로그램은 쓰기가 거추장스럽더군요. 그렇다고 매번 복사하기는 귀찮고 해서 빠르고 간단하게 backup 할 수 있는 python script를 작성하여 사용하고 있습니다. quickBackup.py라는 script로, 실행하면 현재 디렉토리 아래에 ./bak라는 디렉토리를 만들고 파일을 backup해줍니다. 파일 이름이 source.f90일 경우 ./bak/source.bak01.f90 과 같이 복사를 하는 것이죠.

Backup 파일 이름은 option으로 조절할 수 있고, 자동으로 log file을 만들어 언제 어떤 파일을 backup했는지 알려줍니다. 원한다면 backup하면서 간단한 comment도 달 수 있습니다. 가장 마지막에 backup한 파일과 지금 backup하려는 파일이 동일할 경우에는 backup하지 않습니다. 한번에 여러 개의 파일을 backup할 수도 있습니다.^^

 

Gpl Quick Backup
    make ‘./bak’ directory and backup files
Usage :
    quickBackup.py [-h/-b/-t] filename

Required parameters :
    filename

Optional parameters : 
    -h   : place backup number at head ( bak01.filename.extension )
   -b   : place backup number between filename and extension ( filename.bak01.extension )
    -t   : place backup number at tail ( filename.extension.bak01 )
    ** default : -b
    -c   : add comment to the log file ( ./bak/quickBackup.log )

Examples :
    quickBackup.py file1.f90 file2.f
    (edit file1.f90)
    quickBackup.py file1.f90
    ls ./bak
    -> file1.bak01.f90  file1.bak02.f90  file2.bak01.f  quickBackup.log

Backup script

1. gplBackup.sh

이 스크립트는 실수로 rm * 또는 rm –rf * 등의 명령을 내려 작업중인 source code를 삭제했을 때 복구할 수 있도록 파일들을 주기적으로 backup하는 스크립트입니다. 이 스크립트와 cron 명령을 함께 사용하게 되는데, 사용하기 위한 설정 과정은 다음과 같습니다.

1) 위의 스크립트를 Backup하고자 하는 디렉토리들이 있는 가장 상위의 디렉토리에 복사합니다.

예를 들어, /home/userid/codes/modeling과 /home/userid/codes/inversion 두 개의 디렉토리를 backup하고 싶을 때 위 스크립트를 다음의 디렉토리에 복사합니다.

/home/userid/codes/gplBackup.sh

2) 스크립트를 수정하여 backup하고자 하는 디렉토리와 확장자, backup에서 제외하고자 하는 디렉토리를 설정합니다.

Backup할 디렉토리는 dirList라는 배열에 저장합니다. Backup은 recursive하게 수행되기 때문에 subdirectory들 중 제외하고 싶은 디렉토리가 있을 경우, excDirList에 제외하고 싶은 디렉토리명을 써줍니다. Backup은 확장자나 파일명을 기준으로 하게 됩니다. Backup하고 싶은 확장자나 파일명을 extList라는 배열에 적어줍니다. 마지막으로 backupdir 이라는 변수에 backup한 파일들이 들어갈 디렉토리명을 적어주면 기본적인 스크립트 수정이 끝나게 됩니다.

예> backupdir = “/home/userid/codes/backup”

여기 적은 디렉토리는 미리 만들어 놓도록 합니다.

3) crontab -e로 crontab 파일 연 다음 아래의 줄을 추가합니다.

10 * * * * /home/userid/codes/gplBackup.sh

위의 6개의 항목이 의미하는 바는 다음과 같습니다.

분, 시, 일, 달, 요일, 실행 명령

따라서 위의 명령은 매 달, 매 일, 매 시 10분에 backup 스크립트를 실행하라는 명령입니다. 위의 줄을 추가한 후에는 crontab -l로 위의 줄이 추가되었는지 확인할 수 있습니다. 여기까지 해 놓으면 설정이 끝납니다.

위의 스크립트는 매 시 10분에 해당 디렉토리의 해당 파일들을 backup하고 스크립트 40번째 줄에 지정된 시간이 되면 디스크 용량 절약을 위해 지금까지 backup했던 파일들을 삭제합니다. 매일 지정된 시간에 생성된 파일은 남겨둡니다. 지정된 시간에 생성된 파일은 이름이 다릅니다. 기본적으로 매 시간 생성되는 파일은 “backup20090307-1210.tgz” 와 같은 이름을 가지고, 지정된 시간에 생성되는 파일은 “Backup.20090307-1510.tgz”와 같은 이름을 가집니다.

주의사항) 위 스크립트는 rm *과 같은 상황에 대비하기 위해 만든 것이기 때문에 되도록이면 주로 작업하는 code들만 backup하도록 하세요. 현재 컴퓨터에 있는 source code를 전부 backup하고 싶은 경우에는 아래의 gplFullBackup 스크립트를 사용합시다.

또, 공용 서버를 사용하는 경우, 위의 10분이라고 나온 예에서 10분을 27분, 38분과 같이 다른 사람들이 안 쓸 것 같은 시간으로 바꾸세요. 모두가 같은 시간에 backup하도록 한다면 그 시간에 컴퓨터에 많은 부하가 걸리겠죠.

2. gplFullBackup.sh

이 스크립트는 위의 스크립트와 유사한데, 매 시간 실행되는 것이 아니라 사용자가 직접 실행하도록 만든 스크립트입니다. 실행하면 “./backup/FullBackup20090226-1536.tgz” 과 같은 파일을 만들어줍니다.

gpl backup

Gpl Backup Manager (gplbackup)

self document
Gpl Backup Manager
    : backup files matching extensions recursively

Usage :
    gplbackup [cfg filename]

Optional parameters :
    cfg filename     : configuration file(yaml file) name
    --cfg > gplbackup.yml
       : generate sample 'gplbackup.yml' file

Configuration file
    see sample 'gplbackup.yml' file. (use --cfg option)

Gpl backup manager는 현재 디렉토리 하위의 디렉토리를 돌아다니며 원하는 확장자의 파일들을 backup해주는 프로그램입니다. 백업할 때에는 (현재 디렉토리에서 상대적인) 디렉토리 구조를 그대로 만들어주며 백업을 합니다. Backup 하고자 하는 디렉토리와 파일 설정은 yml 파일을 이용하여 해줍니다. 예제 yml 파일은
gplbackup --cfg > gplbackup.yml
과 같이 생성할 수 있습니다. 이렇게 생기는 yml 파일은 아래와 같습니다. 파일은 YAML 문법을 따르는데, 간단하기 때문에 YAML 문법을 몰라도 아래 파일을 수정하여 사용할 수 있습니다.

Sample yml file

# Gpl Backup Manager Configuration File
# Date : 2008.02.21
# Source directories you want to backup
sourceDirectory :
- Documents
- lib

# Extensions of files you want to backup
extensions :
- .f
- .f90
- .c
- .rb
- .sh
- Makefile
- .tex

# A directory name to which the backup files will be copied
targetDirectory : hostname

# Print the copying process (T/F)
verbose : T

# Make "hostnameBak-2008.02.21.tgz" file
# using the targetDirectory (T/F)
makeTarBall : T

# Remove the targetDirectory after backup (T/F)
# - when you want tgz file only
removeBackupDir : F

# Files containing these words in their absolute path
# will be omitted
exclude :
- 'backup'
- 'lib/dms'
- 'lib/UMFPACK'
- 'lib/SU'
- 'lib/seplib'
- '.svn'

예제의 yml 파일에서 #으로 시작하는 부분은 comment입니다.
sourceDirectory :
아래에 ‘-’을 긋고 backup하고자 하는 디렉토리 이름을 적습니다. Backup은 하위 디렉토리까지 recursive하게 합니다. ‘- .’과 같이 적으면 현재 디렉토리와  하위 디렉토리의 모든 파일들을 대상으로 backup합니다. 이 때 모든 파일들을 다 backup하는 것이 아니라
extensions :
에 해당하는 파일들만 backup합니다. 꼭 확장자가 아니라도
- Makefile
과 같이 파일 이름의 끝부분이 같으면 backup합니다. Backup할 때에는 현재 디렉토리 아래에
targetDirectory :
에 지정된 디렉토리를 만들고, 그 아래 파일이 들어있는 디렉토리를 만들어 backup합니다. targetDirectory 이름은 현재 hostname을 기준으로 만듭니다.
verbose :
makeTarBall :
removeBackupDir :

은 T, F로 표시하고 backup 과정을 화면으로 보여줄지, 디렉토리를 만들어 backup한 후 디렉토리를 tgz 파일로 압축할 것인지, 압축 후 backup 디렉토리를 지울 것인지 지정해줍니다. 압축 파일명은 기본적으로 targetDirectory 이름에 현재 날짜를 더해서 만들어줍니다. 같은 이름의 파일이 존재할 경우 뒤에 숫자를 붙여 새로 만들 파일의 이름을 변경해줍니다.

Backup할 때에는 ‘extensions :’에 맞더라도 절대경로에 ‘exclude :’의 내용이 들어가 있는 파일은 제외합니다.

Learning by doing

실행 예를 볼까요? 현재 디렉토리 아래에 gplbackup.yml 파일과 test1, test2, test3 세 개의 디렉토리가 있고, 각각의 디렉토리에는 다음과 같은 파일들이 있습니다.

$ ls -R
.:
gplbackup.yml  test1  test2  test3

./test1:
file1  file2  file2.f90

./test2:
file2.f  file2.f90  file3.f90

./test3:
file1.f90  file2.c

gplbackup.yml 파일의 내용은 다음과 같습니다.

$ cat gplbackup.yml
# Gpl Backup Manager Configuration File
# Date : 2008.11.18
# Source directories you want to backup
sourceDirectory :
- .

# Extensions of files you want to backup
extensions :
- .f90

# A directory name to which the backup files will be copied
targetDirectory : node480Bak

# Print the copying process (T/F)
verbose : T

# Make "node480Bak-2008.11.18.tgz" file
# using the targetDirectory (T/F)
makeTarBall : T

# Remove the targetDirectory after backup (T/F)
# - when you want tgz file only
removeBackupDir : F

# Files containing these words in their absolute path
# will be omitted
exclude :
- 'test3'

현재 디렉토리 아래의 모든 디렉토리를 돌며 backup하는데 .f90 파일만 backup하고, 경로에 ‘test3′이라는 문자열이 들어간 파일은 제외합니다. 실행 결과는 다음과 같습니다.


$ gplbackup gplbackup.yml
in .
cp  ./test2/file2.f90     node480Bak/./test2
cp  ./test2/file3.f90     node480Bak/./test2
cp  ./test1/file2.f90     node480Bak/./test1
3 files are backed up

making tgz ball : node480Bak/
node480Bak/test2/
node480Bak/test2/file2.f90
node480Bak/test2/file3.f90
node480Bak/test1/
node480Bak/test1/file2.f90

node480Bak-20081118.tgz : 207 bytes

현재 디렉토리 밑에 ‘node480Bak’ 라는 디렉토리를 만들고(hostname이 ‘node480′입니다) 그 아래에 디렉토리 구조를 유지하며 .f90 파일들을 backup합니다. yml 파일에서 verbose: T 라고 했기 때문에 backup 과정을 화면으로 출력해주고, makeTarBall: T 라고 했기 때문에 backup 디렉토리를 압축하여 node480Bak-20081118.tgz 파일을 만들어줍니다. 또한, 압축 파일의 크기도 보여줍니다.

이 프로그램은 ruby 프로그래밍 언어로 만들었기 때문에 실행하기 위해서는 ruby(version 1.8 이상)가 필요합니다. 개인적으로 상당히 유용하게 쓰고 있는데, 필요하신 분은 여기에서 받아 쓰세요~^^

이 글은 스프링노트에서 작성되었습니다.



팔로우

Get every new post delivered to your Inbox.

Join 39 other followers