Shell Script와 Crontab으로 오래된 로그, 백업파일 자동 지우기
logback이라던지 log4j2 등 비교적 최근에 나온 logging framework을 사용하면 appender를 이용해 시간이 오래 된 로그를 삭제할 수 있지만 그 전에 나온 log4j 등의 logging framework은 이런 기능이 없다.
따라서 서버에서 오래된 로그를 주기적으로 직접 지워줘야 하는데 이때 사용할수 있는 방법이다.
일단 적당한 위치에 다음과 같은 Shell Script를 작성한다.
#!/bin/sh
echo "#################### `date` delete log list ###########################" >> /logs/old/deleteOldLog.log
find /logs -mtime +30 -type f -ls >> /logs/old/deleteOldLog.log
find /logs -mtime +30 -type f -ls -exec rm -r {} \;
다 작성하고 나면 실행권한도 준다.
$ chmod 755 /xxx/deleteOldLog.sh
find 명령어를 활용해 /logs 하위의 폴더에서 30일이 지난 파일 type의 로그를 /logs/old/deleteOldLog.log 에 기록하고 지운다는 내용이다. find /logs -mtime +30 -type f -ls >> /logs/old/deleteOldLog.log 를 해주는 이유는 find /logs -mtime +30 -type f -ls -exec rm -r {} \; 만 실행시켰을때는 아무런 로그가 남지 않아서 무슨 파일을 지웠는지 모르기 때문에 정보성으로 남겨 놓는것이다. 이걸 응용하여 백업파일이나 오래된 파일들을 자동으로 삭제할 수 있다.
이 script를 바로 실행하면 해당 디렉토리 아래의 30일이 지난 파일들이 자동으로 삭제된다. 매일매일 서버에 들어와서 이걸 실행하지 않으려면 이 script를 crontab에 등록해서 사용하면 된다.
crontab은 리눅스에 내장된 스케쥴러 같은 개념이라고 보면 되고 사용법은 아주 간단하다.
- 현재 크론탭에는 어떤 내용이 들었나 확인
$ crontab -l
- 크론탭 편집
$ crontab -e
이 두가지만 알고 있으면 되고 위의 script를 등록하기 위해 crontab -e 를 치고 들어가서 다음과 같이 crontab을 작성하면 된다. crontab을 작성할때는 Cron Expression을 사용해야 한다.
Cron Expression 간단 설명
주기 설정
*(분 0-59) *시(0-23) *일(1-31) *월(1-12) *요일(0-7) ( space로 구분하여 입력한다.)
* * * * * /xxx/deleteOldLog.sh #매분 deleteOldLog.sh 실행
*/3 * * * * /xxx/deleteOldLog.sh #3분마다 간격실행
0 5 * * * /xxx/deleteOldLog.sh #매일 5시에 실행
0,20,40 * * * * /xxx/deleteOldLog.sh #매일 매시간 0, 20, 40분 반복실행
crontab은 별도로 실행을 시키는 것이 없고 작성하고 저장하는 순간부터 스케쥴링이 시작된다.
다 작성했으면 저장 후 deleteOldLog.log 를 통해 정상적으로 실행이 되는지 확인해 보도록 한다.