본문 바로가기
공부/Linux

쉘스크립트 - 날짜 비교하여 로그파일 생성

by CITTA 2020. 3. 29.
728x90
반응형

현재 근무하는 곳의 고객 요청에 따라 TEST를 위한 쉘 스크립트를 작성하였습니다.

저는 개발자가 아니라 운영 위주로 근무를 해온지라 전문가 분들이 보셨을 경우 이상하실 수도 있습니다.

기본적인 동작 순서는 다음과 같습니다.

* 사전 환경

- 매일 주기적으로 html 파일이 생성된다. (일일 점검 페이지)

- 정기적으로 crontab에 스크립트를 등록하여 매일매일 html -> log 로 별도 저장을 한다.

- 이 log는 Test 목적으로 1일 부터 7일 까지만 생성되고 그 이후는 생성이 안되도록 해야한다. (이 부분을 좀 이해하기 힘들지만.. 고객의 요청으로..)

- 파일명의 끝에는 생성일이 아닌 숫자로 카운트를 한다. ex) 01, 02 ...

* 스크립트 동작 순서

첫번째 파일 생성 확인 -> 생성 안됐을 경우 생성 후 스크립트 종료

이미 생성이 되어있을 경우 < html파일 생성날짜 확인 - 현재 날짜확인 > - 두 날짜 비교 (월, 일 중 일로 확인)

날짜 동일 시

-> 최근 생성된 log파일의 숫자 확인 -> 신규 파일 생성 -> 종료

날짜 동일하지 않을 시

-> 스크립트 종료

대략 이런 순서로 작성 하였습니다.

작성한 스크립트는 다음과 같습니다.

#!/bin/bash
FILE\_DIR="$0"
HTML\_NAME="test.html"
FILE\_NAME="test.html\_0"
TEST\_FILE="./test.html\_01"

if \[ -f $TEST\_FILE \] ;then
    echo "The first log file has already been created."
else
    cp $FILE\_DIR $TEST\_FILE
    exit
fi

HTML\_DATE=$(date -r test.html "+%d")
TODAY\_DATE=$(date "+%d")
FILE\_NUMBER=$(ls -lr test.html\_\*|head -1|awk '{print$9}'|cut -d '0' -f2)
MAX\_NUMBER=7

if \[ $HTML\_DATE = $TODAY\_DATE \] ;then
    if \[ $FILE\_NUMBER -lt $MAX\_NUMBER \] ;then
         FILE\_NUMBER=\`expr $FILE\_NUMBER + 1\`
        cp $HTML\_NAME ./$FILE\_NAME$FILE\_NUMBER
         exit
    else
         exit
     fi
else
    exit
fi

FILE\_DIR="$0" 
HTML\_NAME="test.html" 
FILE\_NAME="test.html\_0"
TEST\_FILE="./test.html\_01"

일단 변수로 현재 위치 지정, html 파일 이름, log파일의 이름으로 사용될 이름(01,02 순서이나 1,2,3,4... 순으로 증가하도록 함) 그리고 처음으로 생성되어야 할 파일 이름 (TEST_FILE)을 지정 하였습니다.

저의 경우 파일의 생성시 숫자의 앞에 0이 붙기 때문에 생성에 사용할 이름의 변수를 0까지 잡은 것 입니다.
일반적으로는 0을 붙이지 않고 그냥 1,2,3,4,... 순으로 가겠죠..

if \[ -f $TEST\_FILE \] ;then
    echo "The first log file has already been created."
else
    cp $FILE\_DIR $TEST\_FILE
    exit
fi

다음은 첫번째 파일 생성유무 확인 입니다. 파일이 생성되어 있을 경우에는 안내 문구 후 다음으로 진행이 되며 없을 경우 첫번쨰 파일을 복사 생성 후 스크립트를 종료하게 하였습니다. 종료하지 않을 경우, 01 파일 생성 후 02번째 파일이 바로 생성이 되기 때문에 꼭 확인이 필요 합니다.
``` HTML\_DATE=$(date -r test.html "+%d") TODAY\_DATE=$(date "+%d") FILE\_NUMBER=$(ls -lr test.html\_\*|head -1|awk '{print$9}'|cut -d '0' -f2) MAX\_NUMBER=7 ```
첫번째 파일 생성 후 다음으로는 html파일의 생성일, 현재 요일을 확인 합니다. 그리고 최근에 생성된 파일의 숫자 (ls -lr 옵션으로 최근 생성일 기준으로 정렬)를 확인 합니다. cut -d 다음에 오는 '0'은 자르기의 기준이 됩니다. 두개 이상의 단어는 안되며 하나의 단어만 가능 합니다. ex) 'a', '1', '-' ... 마지막으로는 특이한 경우로 보통 로그를 수집하기 위한 스크립트의 경우 크론탭에서 별도 지정을 하거나 사용자가 중지하면 됩니다.
허나, 이번의 경우에는 파일을 일주일 동안 총 7개가 생성되어야 합니다. 그래서 MAX_NUMBER 라는 변수를 주고 7까지 주었습니다. 만약 더 길게 필요하다면 변경을 하면 가능 합니다.
``` if \[ $HTML\_DATE = $TODAY\_DATE \] ;then if \[ $FILE\_NUMBER -lt $MAX\_NUMBER \] ;then FILE\_NUMBER=\`expr $FILE\_NUMBER + 1\` cp $HTML\_NAME ./$FILE\_NAME$FILE\_NUMBER exit else exit fi else exit fi ```
추가적인 변수 설정 후 파일 생성을 위한 부분입니다. HTML의 생성일과 현재 요일이 같을 경우 수집한 최근 생성된 파일의 숫자를 비교하여 MAX_NUMBER보다 작은지 확인합니다. 그런 다음 생성파일의 숫자를 1만큼 증가시켜주고, HTML파일을 LOG파일로 copy를 합니다.
만약 정해진 MAX NUMBER와 같거나 클 경우 스크립트는 중지가 되며, 우선적으로 HTML의 생성일이 현재 날짜와 같지 않을 경우에도 스크립트는 중지 됩니다. 이 스크립트의 경우 crontab에 등록 후 계속 사용 시 07번 파일을 생성 후에도 동작은 하겠지만 별도의 파일을 생성하지는 않습니다.
급하게 테스트 목적을 위하여 만들다보니 어딘가 부족한 듯 합니다. 그렇지만 기록의 목적과 필요하신 분들을 위해 이렇게 남깁니다.

감사합니다.

728x90
반응형

댓글