본문 바로가기
개발 이야기/Linux

Shell script로 Backup 기능 작성

by 농개 2019. 3. 15.

어떠한 웹 서비스를 운영하다보면 자동화 하고 싶은 정~~~말 단순한 업무가 생긴다.

리눅스에 익숙치 않지만 간단한 쉘 스크립트를 만들어서 자동화 해보고 싶은 생각이 들었다.


아래는 단순한 작업의 예이다.

  • 운영중인 소스 백업
  • 새로운 소스 배포 
  • 재시작
위의 작업 목록 중 첫번째와 두번째를 쉘 스크립트 대체 하기 위해 리눅스 쉘 프로그래밍을 대학졸업 이후 처음 작성해 보았다...




01. vim 편집기 사용

굳이 vim편집기로 프로그래밍을 할 필요는 없지만, 손에 익힐 겸 vim 편집기로 스크립트를 작성한다.

아래는 많이 쓰는 기능이다.
  • line number 표시 : ESC -> SHIFT + ; -> set number 입력
  • 찾기 : ESC -> / -> 찾을 단어 입력
  • 끝에서 찾기 : ESC -> ? -> 찾을 단어 입력
  • 다음 찾기 : 위의 찾기 후, n 또는 N(다음, 이전)
  • 줄 삭제 : ESC -> dd
  • 줄 복사 : ESC -> yy
  • 특정 영역 복사 : 
    • 영역 지정 : ESC -> v
    • 복사 : ESC -> y
  • 붙여넣기 : ESC -> p

또한 tab 키 입력 시, 4칸 띄워쓰기를 2칸으로 조정했다.
.vimrc 파일에 아래 같이 입력
1
2
# ~/.vimrc 
set tabstop=2
cs








02. backup 기능 작성

단순한 backup이다. 운영중인 프로젝트 폴더를 '프로젝트명_오늘날짜' 형식으로 백업 할 것이다.

만약 오늘 날짜에 백업을 1번 이상 하게 되면 '프로젝트명_오늘날짜_숫자' 형식으로 할 것이다.(아직도 이렇게 운영중인 서비스가 있긴 하다...)



~/script.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/bin/bash
APP_NAME=Project ## 어플리케이션명
NOWDATE=$(date +%Y%m%d) ## 오늘 날짜
WWW=/home/jckang/www ## 배포 디렉터리
BAK_PATH=$WWW'/'$APP_NAME'_'$NOWDATE ## 백업 디렉터리
 
backup(){
  # Backup directory
  src_path=$WWW'/'$APP_NAME
  des_path=$1
  mv $src_path $des_path
}
 
 
case $1 in
  backup)
    echo "Starting backup..."
    if ! [ -d $BAK_PATH ]; then
      backup $BAK_PATH
      echo "Done. $BAK_PATH"
    else
      i=1
      while [ $i ]
      do
        if ! [ -d $BAK_PATH'_'$i ]; then
          backup $BAK_PATH'_'$i
          echo "Done. $BAK_PATH'_'$i"
          break
        fi
        i=$(($i+1))
      done
    fi
  ;;
 
esac
 
cs


  1. 자동화에 필요한 변수들을 정의한뒤
  2. backup 기능을 할 함수를 만든다.. mv 명령어로 백업
  3. case문을 써서 backup이 인자로 입력되면 해당 기능을 수행한다.
  4. 작성시 띄어쓰기 유의 할것!!(한참 해맷다.ㅜㅜ)




03. 배포 작성

배포는 더 단순하다. 그냥 war파일을 해당 디렉터리에다가 jar명령어로 압축 풀어 주면 된다.
아래 예제에서는 tar로 대체하고 작성하였다.

~/script.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/bin/bash
...
ZIP_NAME=Project.tar ## 추가됨
ZIP_PATH=/home/jckang ## 추가됨
...
 
 
...
unzip(){
  # Move Tar file and Unzip
  cd $WWW
  cp $ZIP_PATH'/'$ZIP_NAME $WWW
  tar -xvf $ZIP_NAME
  rm $ZIP_NAME
  cd -
}
 
case $1 in
  ...
  unzip)
    echo "Starting unzip..."
    unzip
    echo "Done."
  ;;
 
esac
 
cs

  1. 추가적으로 변수를 추가해주었다.
  2. unzip 함수를 작성했다. 기능은 단순하다. tar 파일을 copy한 다음, 압축 풀기
  3. cd - 로 sh파일 실행 경로로 되돌아옴.


04. 완성본

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#!/bin/bash
APP_NAME=Project
ZIP_NAME=Project.tar
ZIP_PATH=/home/jckang
NOWDATE=$(date +%Y%m%d)
WWW=/home/jckang/www
BAK_PATH=$WWW'/'$APP_NAME'_'$NOWDATE
 
backup(){
  # Backup directory
  src_path=$WWW'/'$APP_NAME
  des_path=$1
  mv $src_path $des_path
}
 
unzip(){
  # Move Tar file and Unzip
  cd $WWW
  cp $ZIP_PATH'/'$ZIP_NAME $WWW
  tar -xvf $ZIP_NAME
  rm $ZIP_NAME
  cd -
}
 
case $1 in
  backup)
    echo "Starting backup..."
    if ! [ -d $BAK_PATH ]; then
      backup $BAK_PATH
      echo "Done. $BAK_PATH"
    else
      i=1
      while [ $i ]
      do
        if ! [ -d $BAK_PATH'_'$i ]; then
          backup $BAK_PATH'_'$i
          echo "Done. $BAK_PATH'_'$i"
          break
        fi
        i=$(($i+1))
      done
    fi
  ;;
 
  unzip)
    echo "Starting unzip..."
    unzip
    echo "Done."
  ;;
 
  all)
    sh $0 backup
    sleep 1
    sh $0 unzip
  ;;
 
esac
cs

./script.sh all을 하면 두 작업을 한꺼번에 하게 만들었다.




결과 화면은 아래와 같다.(몇번 반복 수행해봄)