개발로그

자동 파일 삭제 cron 만들기

pizzalist 2024. 4. 15. 21:21

배경

맡은 프로젝트 ec2에 sql문 자동 backup 파일이 저장된다. 그 파일들을 일정 날짜가 지나면 자동 삭제하는 프로그램을 만들고자 한다.

 

쉘을 활용한 파일 삭제 cron

우선 첫번째 접근으로 쉘을 활용한 명령어로 삭제하는 방법을 제시했다.

 

1. test.sh 작성

find ./ -name '*.sql' -mtime +100 -delete

 

2.  실행 권한 주기

> chmod 755 test.sh

 

3.스케줄 등록하기

>crontab -e
30 00 * * * /tmp/test.sh
# 매일 00:30분에 위 쉘을 실행함

 

문제점

위 방법의 문제점은 위 사진처럼 딕셔너리에는 datetime의 제목이 아닌 다른 형식의 sql문도 존재한다. backup.sql문이 그 예시이다.

하지만 이 파일은 지우면 안된다. 그렇기 때문에 기각.. python으로 자동삭제 프로그램을 만들고자 하였다.

 

 

Python을 이용한 기준 날짜 지정 파일 자동 삭제 프로그램

지워야 할 파일들은 datetime의 제목을 가지고 있다.

그래서 기준 날짜를 정하여 datetime 이전의 제목을 가진 파일들을 자동 삭제해주는 python 코드를 짜보았다.

import os
import datetime
import glob
import re

current_date = datetime.date.today()
three_months_later = current_date - datetime.timedelta(days=3 * 30)

file_list = glob.glob("*.sql")
regex = re.compile(r"\\d{4}-\\d{2}-\\d{2}.sql")
for file in file_list:
    if regex.match(file):
        file_date_str = file.split(".")[0]
        file_date = datetime.datetime.strptime(file_date_str, "%Y-%m-%d").date()
        if file_date < three_months_later:
            os.remove(file)

위 코드는 잘 돌아가지만 실제로 쓰기에는 보완점이 필요해 보인다는 feedback을 받았다.

  • 절대 경로 설정

최종 코드

import os
import re
import glob
import datetime

import argparse

import logging

logger = logging.getLogger(__name__)
logging.basicConfig(
    format="[%(asctime)s - %(levelname)s - %(name)s] %(message)s",
    datefmt="%Y/%m/%d %H:%M:%S",
    level=logging.INFO,
)

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("--path", type=str, help="경로를 넣어주세요.")
    parser.add_argument("--ext", type=str, help="파일 확장자를 넣어주세요.")
    parser.add_argument("--days", type=int, help="삭제 기준일을 넣어주세요.")
    args = parser.parse_args()

    current_date = datetime.date.today()
    standard_date = current_date - datetime.timedelta(days= args.days)

    #삭제 기준일 logging
    logger.info(f"Delete data for dates prior to {standard_date}")

    # YYYY-MM-DD 형식의 파일만 찾는다
    regex_date_fmt = re.compile(r"\\d{4}-\\d{2}-\\d{2}")

    # ["path/file.ext", "path/file2.ext"]
    file_list = glob.glob(os.path.join(args.path, f"*.{args.ext}"))

    if file_list:
        for file in file_list:
            # pure file name
            file_name = file.split(args.path)[-1]
            file_name_without_ext = os.path.splitext(file_name)[0]

            # file name이 datetime인지 확인 
            if regex_date_fmt.match(file_name_without_ext):
                file_date = datetime.datetime.strptime(file_name_without_ext, "%Y-%m-%d").date()

                # 기준일 이전 file 삭제 
                if file_date < standard_date:
                    os.remove(file)
                    logger.info(f"removed ! {file}")

실행 쉘 명령어

python3 delete_backup.py --path /your_path/mysql/ --ext sql --days 100 >> /your_path/mysql/loggingdir/$(date +%Y-%m-%d).log 2>&1

추가 사항

  • regex에는 정규표현식만 들어가게 .sql의 추가문을 삭제하였다.
  • argparse를 사용하여 명령 쉘에 절대경로를 설정해서 사용할수 있게 하여, 다른 상황에서도 사용 가능하게 바꿔주었다.
    • path, ext 뿐만 아니라 days까지 arg로 받게 되어 코드에서 지정되었던 기준 일짜를 쉘을 통해 변경 가능하도록 프로그래밍을 하였다.
  • logging을 추가하여 프로그램이 자동으로 돌아가는 상황을 log로 저장하여 확인할 수 있게 하였다.
  • 주석 처리를 통해 프로그램에 대한 설명을 추가하였다.

'개발로그' 카테고리의 다른 글

[Python] Logging  (0) 2024.04.15
[Python] Argparser  (0) 2024.04.15
Docker란 무엇인가? (컨테이너, 이미지, 볼륨)  (0) 2024.04.15
[Linux] shell 명령어  (0) 2024.04.15
[MySQL] MySQL 용량 확인 방법  (0) 2024.04.15