Django crontab 스케줄러 작성

Gom La·2023년 5월 22일
0

장고와 친해지기

목록 보기
17/17
post-thumbnail

🍃 Crontab

crontab은 Linux 운영체제에서 시간 기반 잡 스케줄러이다.

즉, 원하는 시간에 원하는 작업을 수행할 수 있게 해주는 작업 스케줄러라고 보면 된다.

예를 들어 장고에서 로그인을 했을 때, session으로 
구현된 로그인이라면 django-session에 session정보가 
저장되었다가 로그아웃하면 삭제가 된다. 

하지만 브라우저가 닫히거나 만료시간이 지나게 되면 
session정보는 유지되며 로그아웃 처리가 되기 때문에 
계속되는 로그인 많아지면 불필요한 session 데이터가 쌓여 자리를 차지하게 된다.

이때 특정 시간이 되면 만료가 된 session정보를 삭제해 줬으면 좋겠다.

위의 기능을 대신 해주는 것이 바로 crontab!!이다.

🌱 django-crontab 설치

먼저 다음 명령어를 통해 django-crontab을 설치해 준다.

$ pip3 install django-crontab

설치가 완료되면 django 프로젝트의 settings.pyINSTALLED_APPS에 해당 앱을 등록해 준다.

🌱 파일생성 및 코드

그리고 특정 앱 폴더 안에 주기적으로 실행할 파일을 작성준다.

├── core
│   ├── __init__.py
│   ├── __pycache__
│   ├── admin.py
│   ├── apps.py
│   ├── cron.py  <---------- 주기적으로 실행할 파일 cron.py
│   ├── log
│   ├── mergeLog
│   ├── migrations
│   ├── models.py
│   ├── tests.py
│   └── views.py
import os
import glob
from django.contrib.sessions.models import Session
from datetime import datetime

def delete_sessions():
    # dir_path = "/log"
    # if not os.path.isdir(dir_path):
    #     os.makedirs(dir_path)
    
    sessions = Session.objects.all()
    for session in sessions:
        print("===================================")
        print(f"현재시간: {datetime.now()}", end=", ")
        print(f"만료시간: {session.expire_date}")
        if datetime.now() > session.expire_date:
            session.delete()
            print("Delete completely expire_date!")

cron.py의 내용은 현재시간과 django-session에 만료 시간을 확인하여, 만료 시간이 현재보다 이전 즉 이미 만료된 session정보는 삭제하는 코드를 작성해 주었다.

🌱 설정

➤ settings.py

CRONJOBS = [
    ('*/1 * * * *', 'core.cron.delete_sessions', '>> '+ os.path.join(BASE_DIR, f'core/log/cron_{datetime.now().strftime("%Y-%m-%d")}.log')),
]

settings.py로 돌아와서 위의 코드를 추가하자.
위 코드는 ({작업 시간 단위}, {실행할 파일, 작업, 행동 등}, {작성할 Log 파일})이다.

내 cron의 경우 1분 간격으로 deletesessions 함수를 실행하고 core/log/ 경로에 `cron{datetime.now().strftime("%Y-%m-%d")}.log`이름을 가진 로그파일을 일자마다 쌓이게 설정을 해 주었다.

➤ 시간 설정
여기서 cron의 개념을 짚고 넘어가자.
(* * * * *)다섯 개의 작업 시간 단위가 존재하며, 왼쪽부터 순서대로 (분 시 일 월 요일)이다.

  • 분 : 0 - 59
  • 시 : 0 - 23
  • 일 : 1 - 31
  • 월 : 1 - 12
  • 요일 : 0 - 7(1-7은 월요일 - 일요일이고 0도 일요일이다.)

각 시간의 단위는 공백으로 구분한다.
*은 매 분, 시, 일, 월, 요일 을 뜻한다.

➤ 실행 프로그램 설정
설정한 시간 ',' 다음에 'core.cron.delete_sessions' 와 같이 특정 app.file_name.funtion_name을 입력하여 주기적으로 실행될 파일의 함수를 기술하자.

  • ,는 &를 의미
  • -는 기간, 동안을 의미
  • */숫자 는 간격을 의미
  • * * * * */home/test.sh
    - 매 분, 시, 일, 월, 요일마다 test.sh파일 실행
    - 즉, 매분마다 test.sh파일 실행
  • 10 * * * * /home/test.sh
    - 매일 매시간 10분에 test.sh파일 실행
  • 30 5,15 * /home/test.sh
    - 매달 5일과 15일 매시간 30분에 test.sh파일 실행
  • /5 * * 1 /home/test.sh
    - 월요일마다 5분 간격으로 test.sh파일 실행
  • 0-30 5 * * * /home/test.sh
    - 매일 5시 정각부터 30분까지 test.sh파일 실행

🌱 실행

터미널에서 manage.py 가 존재하는 위치에서 다음 명령어를 실행한다.

$ python3 manage.py crontab add

그러면 접근하는 것을 허용할 것인지 물어보는데 확인을 누르면 작성한 cron이 활성화 된다.

$ python3 manage.py crontab show

이 명령어는 등록된 crontab의 목록을 확인 할 수 있다.

$ python3 manage.py crontab remove

cron작업을 모두 지우고 싶으면 remove명령어로 지울 수 있다.

🌱 결과

core>log 안에 시간이 표시된 log 파일이 생성된 것을 확인 할 수 있었고,

log파일 안에 내가 작성한 시간과 session이 삭제되었을 때 문구가 출력되는 것을 확인 하였다.

profile
인생 개발자 라곰!!

0개의 댓글