어떠한 웹 서비스를 운영하다보면 자동화 하고 싶은 정~~~말 단순한 업무가 생긴다.
리눅스에 익숙치 않지만 간단한 쉘 스크립트를 만들어서 자동화 해보고 싶은 생각이 들었다.
아래는 단순한 작업의 예이다.
- 운영중인 소스 백업
- 새로운 소스 배포
- 재시작
위의 작업 목록 중 첫번째와 두번째를 쉘 스크립트 대체 하기 위해 리눅스 쉘 프로그래밍을 대학졸업 이후 처음 작성해 보았다...
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 |
- 자동화에 필요한 변수들을 정의한뒤
- backup 기능을 할 함수를 만든다.. mv 명령어로 백업
- case문을 써서 backup이 인자로 입력되면 해당 기능을 수행한다.
- 작성시 띄어쓰기 유의 할것!!(한참 해맷다.ㅜㅜ)
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 |
- 추가적으로 변수를 추가해주었다.
- unzip 함수를 작성했다. 기능은 단순하다. tar 파일을 copy한 다음, 압축 풀기
- 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을 하면 두 작업을 한꺼번에 하게 만들었다.
결과 화면은 아래와 같다.(몇번 반복 수행해봄)
'개발 이야기 > Linux' 카테고리의 다른 글
리눅스 자주 쓰는 명령어2 (0) | 2019.06.24 |
---|---|
리눅스_명령어 kill, ps, grep, awk 함께 사용하기 (0) | 2019.04.18 |
리눅스_echo 명령어! (0) | 2018.10.20 |
리눅스_네트워크 수동 설정 후 Warning 없애기 (0) | 2018.07.27 |
리눅스_우분투 root계정 로그인 설정하기 (0) | 2018.07.27 |