본문 바로가기
Python/FastAPI

[FastAPI] 크론탭(Crontab) 스케쥴러 만들기

by 검은냥냥이 2023. 2. 9.

백엔드 개발을 하다 보면 특정 시간 혹은 날짜에 맞춰 스케쥴러를 돌려야 할 때가 있습니다. 이럴 때는 아래와 같은 방법으로 진행하면 쉽게 처리할 수 있습니다.

 

쉘 스크립트 형태

크론탭 실행 파일 생성

`crontab.py` 파일 생성

# -*- coding:utf-8 -*-

import logging
import os
import sys
from datetime import datetime

import pytz
import uvicorn
from fastapi import FastAPI

from sql import database, models

sys.getdefaultencoding = lambda: "UTF-8"
sys.getfilesystemencoding = lambda: "UTF-8"

database.Base.metadata.create_all(database.engine)

app = FastAPI()
db = database.SessionLocal()


def CronTab():
    """
    크론 탭
    """

    global logger

    try:
        # logger instance 생성
        logger = logging.getLogger(__name__)

        # formatter 생성
        formatter = logging.Formatter('[%(asctime)s][%(levelname)s|%(filename)s:%(lineno)s] >> %(message)s')

        # handler 생성 (stream, file)
        streamHandler = logging.StreamHandler()
        fileHandler = logging.FileHandler('./crontab.log')

        # logger instance에 fomatter 설정
        streamHandler.setFormatter(formatter)
        fileHandler.setFormatter(formatter)

        # logger instance에 handler 설정
        logger.addHandler(streamHandler)
        logger.addHandler(fileHandler)

        # logger instnace로 log 찍기
        logger.setLevel(level=logging.DEBUG)
        logger.info("[INFO] Crontab Start")
        logger.info(f"[INFO] Republic of Korea Time : {datetime.now(pytz.timezone('Asia/Seoul')).strftime('%Y-%m-%d %H:%M:%S')}")

        # ... 로직 처리 구간
    except Exception as e:
        exc_type, exc_obj, exc_tb = sys.exc_info()
        logging.warning(f"{e} {exc_type, os.path.split(exc_tb.tb_frame.f_code.co_filename)[1], exc_tb.tb_lineno}")
        logger.error(f"{e} {exc_type, os.path.split(exc_tb.tb_frame.f_code.co_filename)[1], exc_tb.tb_lineno}")
        pass
    finally:
        # 디비 접속 끊기
        db.close()

        # 시스템 종료
        sys.exit(-1)


# 크론 탭 로직 실행
CronTab()

if __name__ == "__main__":
    uvicorn.run("crontab:app", host="0.0.0.0", port=8000, log_level="info")

 

쉘 스크립트 (.sh)

`crontab.sh` 파일 생성

#!/bin/bash
source /home/ubuntu/프로젝트_폴더_경로
exec python -m crontab

 

Crontab 명령어로 바로 실행

로그를 누적하는 형태 `>>`

* * * * * /usr/bin/python /home/ubuntu/test.py >> /home/ubuntu/test.log 2>&1

 

로그 파일을 매번 갱신 `>`

* * * * * /usr/bin/python /home/ubuntu/test.py > /home/ubuntu/test.log 2>&1

 

CURL을 이용한 API 호출 형태

내부 백엔드 API 주소로 호출하여 로직 실행

* * * * * /usr/bin/curl -s -o /dev/null http://localhost:8001/API_호출_주소

 

Crontab 관련

기본 명령어

명령어 설명
crontab -l 목록 조회
crontab -e 내용 수정
crontab -r 내용 삭제
crontab -u 특정 user의 crontab 설정시
crontab -i 내용 삭제 전 문구 확인하기
tail -f /var/log/syslog crontab 로그 감시
sudo service cron restart crontab 재시작 (내요 수정시)

 

시간 설정 참고

* * * * * : 1분 마다 실행

0 5 * * * : 매일 5시 0분에 실행

5 * * * * : 매시 5분이 될 때마다 실행. 즉, 한 시간 간격으로 실행

* * * * * : 1분에 한 번씩 실행

0 5 1 * * : 매달 1일 새벽 5시에 실행

0 5,11 * * * : 새벽 5시와 밤 11시

0 5,11 * * 0,3 : 매주 일요일과 수요일 새벽 5시와 밤 11시

 

이외 명령어

로그 파일 감시

tail -f crontab.log

 

라인수를 추가하여 파일 감시

tail -n 10 -f crontab.log
728x90
사업자 정보 표시
레플라 | 홍대기 | 경기도 부천시 부일로 519 화신오피스텔 1404호 | 사업자 등록번호 : 726-04-01977 | TEL : 070-8800-6071 | Mail : support@reafla.co.kr | 통신판매신고번호 : 호 | 사이버몰의 이용약관 바로가기