Shell Script와 서버 작업 자동화

쉘 스크립트를 통한 서버 작업 자동화 및 운영(DevOps)

Why? 왜 필요한가?

서버는 일반적으로 로그파일을 생성한다. 생성 도중 용량 문제 등으로 작업이 중지되어 프로그램이 비정상적인 동작을 하여 다운되었다고 가정했을 때, 어떻게 문제를 해결할 수 있을까?

간단한 쉘 스크립트를 통해 일정 시간이 경과한 로그파일을 자동으로 삭제해주면 저장 공간에 대한 오류는 해결할 수 있다.

쉘 스크립트

쉘 명령어를 기본으로 하되, 몇 가지 문법이 추가된 형태이다.

쉘 스크립트는 filename.sh 형태의 파일로 작성 후, 파일을 실행한다.

기본 문법

파일의 가장 첫 라인은 #!/bin/bash로 시작한다.

쉘 스크립트 파일은 실행 시 권한을 가지고 있어야한다.
- chmod 777 <FileName>등과 같이 실행 권한을 부여해준다.

1. 변수

  • 변수명='text' 와 같이 띄어쓰기 없이 입력해준다. text 내의 띄어쓰기는 가능하다.

  • $ 기호를 통해 변수임을 알려준다.

1
2
3
4
5
#!/bin/bash

my_name='Dongryeol Jeong'

echo $my_name

2. 배열

  • 변수명=(데이터1 데이터2 데이터3) 과 같이 배열을 선언할 수 있다.

  • ${변수명[인덱스번호]) 로 배열을 출력할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash

test=("http" "sqld" "test")

# 배열의 모든 데이터 출력 출력
echo ${test[@]}
echo ${test[*]}

# 배열의 특정 인덱스 출력
echo ${test[1]}

# 배열의 크기 출력
echo ${#test[@]}

# 디렉토리의 파일 리스트를 배열로 입력받는 법
file = $(ls)
# 출력
echo ${file[*]}

3. 지역변수

  • $$ : 쉘의 프로세스 번호, pid

  • ls -al -z를 실행했을 때

    • $0 : 쉘 스크립트 이름 (ls)

    • $1 ~ $9 : 명령 줄의 인수 ($1 : -al , $2 : -z)

    • $* : 모든 명령줄 인수 리스트 (-al -z)

    • $# : 인수의 개수 (2개)

    • $? : 최근 실행한 명령어의 종료 값

      • 0 : 성공
      • 1 ~ 255 : 에러 메세지

4. 연산

  • `expr` : 숫자 계산

  • 피 연산자와 연산 기호를 expr 뒤에 붙혀준다.

  • 괄호에는 항상 \(역슬래쉬)를 붙여주어야한다.

1
2
3
4
5
#!/bin/bash

ret=`expr \( 10 + 20 \) / 8 + 1`

echo $ret

5. 조건문

  • if로 시작하여 fi로 끝내준다.

  • 값 비교 문법

    • -z : 문자가 null이면 true
    • -n : 문자가 null이면 false
    • -eq : equal (같으면 참)
    • -ne : not equal (다르면 참)
    • -lt : less than
    • -le : less or equal
    • -gt : greater than
    • -ge : greater or equal

파일 검사 문법

  • -e : 파일이 존재하면 true
    • -d : 파일이 디렉토리이면 true
    • -h : 심볼링 링크파일이면 true
    • -f : 일반 파일이면 true
    • -r : 읽기 가능하면 true
    • -s : 파일 크기가 0이 아니면 true
    • -u : 파일이 set-user-id가 설정되면 true
    • -w : 파일이 쓰기 가능 상태이면 true
    • -x : 파일이 실행 가능 상태이면 true
1
2
3
4
5
6
7
8
9
#!/bin/bash

if [ $1 -eq $2 ]
then
echo "Same Values"
exit
else
echo "Different Values"
fi

6. 반복문

for문
  • for 변수 in 변수값1 변수값 2 ... 로 범위를 설정하고, do 다음 줄에 실행구문을 작성하고 done으로 반복문을 종료한다.

  • ls를 통해 디렉토리에 있는 모든 파일을 출력해주고 끝내는 반복문

1
2
3
4
5
6
#!/bin/bash

for data in $(ls)
do
echo $data
done
while문
1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash

list=$(ls)
num=${#list[*]}
index=0

while [ $num -ge 0 ]
do
echo ${list[$index]}
index=`expr $index + 1`
num=`expr $num - 1`
done

서버에서 쉘 스크립트 사용

ping 명령어를 통해 ip에 요청을 보내고 응답이 돌아올 시 “GateWay ping succeed” 구문을 출력하고, 실패 시 “GateWay ping failed” 구문을 출력하게 하여 서버가 열려있는지 확인할 수 있다.

타 컴퓨터와 협업을 할 때 ping을 통해 확인하고, 성공 시 작업을 수행하게 할 수 있다.

1
2
3
4
5
6
7
8
9
10
#!/bin/bash

ping -c 1 192.168.0.3 1> /dev/null

if [ $? == 0 ]
then
echo "GateWay ping succeed"
else
echo "GateWay ping failed"
fi

백업하기

두 개의 인자를 받았을 때 null이면 파일을 만들어서 폴더에 넣어주고, 아니면 각각 디렉토리에 날짜를 포함한 이름을 설정하여 저장

압축 명령
  • tar : 과게어는 여러 파일을 묶기만 했었지만, 현재는 파일을 묶고 압축할 수 있다.
  • 주요 옵션
    • x : 묶음 해제
    • c : 파일 묶음
    • v : 묶음 / 해제 과정을 화면에 표시
    • z : gunzip 사용
    • f : v파일 이름 지정
    • 압축 시 주로 사용하는 옵션 : tar -cvzf [압축파일 이름] [압축할 파일 or 폴더명]
    • 해제 시 주로 사용하는 옵션 : tar -xvzf [압출 해제할 아카이브 이름]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash

if [ -z $1 ]||[ -z $2 ]; then
echo usage: $0 sourcedir targetdir
else
SRCDIR=$1
DSTDIR=$2
BACKUPFILE=backup.$(date +%y$m$d$H$M$S).tar.gz
if [ -d $DSTDIR ]; then
tar -cvzf $DSTDIR/$BACKUPFILE $SRCDIR
else
mkdir $DSTDIR
tar -cvzf $DSTDIR/$BACKUPFILE $SRCDIR
fi
fi

Logfile 정리하기

정책을 먼저 정하고, 그에 따라 파일을 어떻게 관리해줄 것인지 구현한다.

2일이 경과한 log파일은 gz파일로 압축시켜주고, 압축된 지 3일이 경과한 파일은 삭제하도록한다.

find 함수를 통해 아래와 같이 구현할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash

LOGDIR=/var/log
GZIPDAY=1
DELDAY=2

cd $LOGDIR
echo "cd $LOGDIR"

sudo find . -type f -name '*log.*' -mtime +$GZIPDAY -exec bash -c "gzip {}" \; 2> /dev/null
sudo find . -type f -name '*.gz' -mtime +$DELDAY -exec bash -c "rm -f {}" \; 2> /dev/null


Shell Script와 서버 작업 자동화

http://inwoo.github.io/10/14/shell/

Author

Inwoo Jeong

Posted on

2021-10-14

Updated on

2021-10-14

Licensed under

You need to set install_url to use ShareThis. Please set it in _config.yml.

댓글