용량이 가득 차버렸다.

김상우·2022년 9월 24일
0

Shell

목록 보기
4/4
post-thumbnail

centos7 을 활용하던 중 vm이라고는 하지만 나름 리소스를 많이 할당한 것 같은데 이 vm의 저장공간의 상태가 썩 좋지 않았다.

엄청난 서비스를 하고 있는 것도 아닌데 용량이 자꾸 딸리는이유에 대해서 고민하고 있던 중 로그파일이 굉장히 많이 쌓일 수 있다고 생각이 들었다.

그렇다면 이 로그파일을 어떻게 관리해야할까?

무작정 삭제하기엔 방금까지 액션에 대한 로그가 쌓이고 있어 그냥 삭제해버리기엔 무언가 부담이 됐다.

그래서 생각한 해답은 그냥 압축 해버리는 것이 제일 용량적인 문제를 해결할 수 있다고 생각이 들었다.

근데 매번 명령어를 입력해서 로그파일의 생성 시간을 확인하면서 오래된 것들은 삭제하고.. 이런 작업을 주기적으로 해야한다면 상당히 번거로울 것 같았고 시간이 지나면 잊어버릴 것 같아 그냥 cron으로 스크립트를 실행하는 예약을 해버리고자 했다.

로그파일의 용량 확인

앞서 생각했던 대로 날짜별로 로그파일이 쌓여있는 것을 확인했다.

그래서 로그파일의 용량을 확인해보았다.

ls -lah | grep *.log

이 명령어로 로그파일의 용량을 확인할 수 있었는데 이 중 용량을 많이 차지한 것은 megabyte 단위까지 넘어간 것을 알 수 있었다.
일반적으로 많아야 kilobyte 라고 생각했는데...

이제 이 로그파일이 쌓이는 디렉토리에 스크립트를 넣어줄 것이다.

필요한 명령어 정리

스크립트 하나로 여러개의 명령어를 수행할 것이기 때문에 어떤 명령어가 필요한지 생각하고 정리해보았다.

일단 로그파일들을 압축하기 위한 명령어가 필요했다.

당시 내가 생각했던 압축 방식은 두가지가 있었는데, 하나는 tar방식이고 다른 하나는 gz방식이었다.

압축

.tar

tar 방식으로 압축하는 것은 단순히 아카이빙을 해서 모아놓은 압축방식으로 압축이라고는 하지만 용량은 변화가 없다.

.gz

gz 방식은 압축했을 때 파일의 크기가 상당히 작아지는 효과를 볼 수 있는 무손실 압축 방식이다.
단점은...여러개의 파일을 하나로 압축할 수 없다는 점이었다...

.tar.gz

그래서 그냥 두가지 방법을 같이 사용하기로 했다.

  • 먼저 각각의 로그파일을 gz방식으로 무손실 압축을 한다.
  • 그 다음 gz으로 압축된 모든 로그파일을 tar방식으로 하나로 묶어 그걸 다시 gz방식으로 압축한다.

필요 없는것 삭제

압축 방식을 생각했으니, 압축하고 남은 잔재를 삭제할 것이다.
단, 이 스크립트를 cron으로 예약 실행할 것이기 때문에 어떠한 메세지도 보이지 않게 할 것이다.

> dev/null 2>&1

명령어 수행 후에 오류나 메세지 등이 나타나는 명령줄 뒤에 이걸 추가하면 명령어가 실행되고 메세지가 안보인다.

오래된 파일 삭제

아무리 용량을 줄이는 압축을 수행했다고 해도 또 오랜세월이 지나면 용량이 찰 것이므로 대략...3년정도가 지나면 삭제가 가능하도록 find ~ -delete를 사용하기로 했다.

순서 정리

대충 어떤 것들을 사용할 것인지 생각했으니 순차적으로 과정을 스케치 해보면 다음과 같았다.

  1. 스크립트가 수행되는 날짜의 이름으로 디렉토리 생성
  2. 모든 로그파일을 gz방식으로 압축
  3. gz으로 압축된 파일을 생성된 디렉토리로 이동
  4. 압축된 파일을 이동하고 남은 로그파일 삭제
  5. gz으로 압축된 파일이 들어간 디렉토리를 tar.gz 으로 재압축
  6. 압축 후 남은 디렉토리 삭제
  7. 모든 과정 후 약 3년이 지난 시점의 tar.gz으로 압축된 파일 삭제

스크립트 작성

#!/bin/bash

dstring="`date +'%Y%m%d'`"
mkdir $dstring

gzip *.log /$dstring > /dev/null 2>&1
mv *.gz $dstring

rm -rf *.log

tar -zcf $dstring.tar.gz $dstring/
rm -rf $dstring

find /로그 파일 저장 위치/ -mtime +1094 -type f -name *tar.gz -delete
  1. 디렉토리 이름을 넣어 줄 변수 dstring에 스크립트가 실행되는 날짜가 대입될 수 있게 했다.
  2. 생성날짜를 이름으로 가진 디렉토리를 생성한다.
  3. gzip 명령어를 통해 모든 로그파일을 방금 생성한 디렉토리 안으로 넣었다.
    근데 여기서 > /dev/null 2>&1 을 넣지 않고 수행해보니 메세지가 출력되길래 여기에 미출력 옵션을 추가했다.
  4. 남아있는 로그파일 삭제
  5. tar 명령어로 .gz파일이 들어간 디렉토리를 tar.gz의 형태로 압축했다.
  6. 다시한번 압축 후 덩그러니 남은 디렉토리를 삭제 했다.
  7. 이제 이 스크립트가 실행 되는 시점 기준으로 3년 전 파일은 삭제할 수 있도록 find ~ -delete 명령어를 추가 했다.

일단 -mtime 옵션을 분단위로 변경하고 테스트 할 때는 잘 작동 하긴 했다.

실행 예약

이 스크립트를 한달마다 실행하기 위해서 cron을 통해서 예약 할 것이다.
정확하게 매월 1일 내가 아직 무언가를 하기 전인 오전 5시에 수행할 수 있도록 할 것이다.

crontab -e

0 5 1 * * /로그파일 저장 위치/방금 작성한 스크립트

잘 작동 되겠지..?

profile
아침엔 운동하고 밤엔 잠을 잔다.

1개의 댓글

comment-user-thumbnail
2022년 11월 8일

지리긴하네요

답글 달기