배경
맡은 프로젝트 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 |