백엔드 개발을 하다 보면 특정 시간 혹은 날짜에 맞춰 스케쥴러를 돌려야 할 때가 있습니다. 이럴 때는 아래와 같은 방법으로 진행하면 쉽게 처리할 수 있습니다.
쉘 스크립트 형태
크론탭 실행 파일 생성
`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 | 통신판매신고번호 : 호 | 사이버몰의 이용약관 바로가기
'Python > FastAPI' 카테고리의 다른 글
[FastAPI] PyCharm에서 디버그 실행 환경 만들기 (0) | 2023.03.31 |
---|---|
[FastAPI] 스웨거(Swagger) `OAuth2 인증 Authorize 적용`하기 (0) | 2022.12.12 |
[FastAPI] 스웨거(Swagger) HTTP 기본 인증 `Authorize` 적용하기 (0) | 2022.12.12 |