AI 웹개발반/Python, Django

[TIL] django cron / crontab

째깍단 2023. 6. 13. 11:18

https://pypi.org/project/django-cron/0.1/

 

django-cron

Running python crons in a Django project

pypi.org

 

https://pypi.org/project/django-crontab/

 

django-crontab

dead simple crontab powered job scheduling for django

pypi.org

 

 

 

 

cron과 crontab

'django-cron' & 'django-crontab'

 

cron이란 소프트웨어 데몬으로, 단순 반복 작업 자동화를 시킬때 사용하며,

관리자가 원하는 시간, 날짜에 주기적으로 실행시킬 수 있다.

 

 

모델이 종료되는 시간에 따라 확인해주는 로직이 필요해 사용하게 되었다!

 

두 패키지는 기능 상 큰 차이는 없지만 작성법이 다르므로 공식문서를 통해 따라해보는 것이 좋다.

 

 

 


 

 

 

 

- django-cron

 

settings.py에 패키지 설치를 알리고, 파일 위치와 자신의 함수 이름을 적어준다.

 

INSTALLED_APPS = [
	"django_cron",
	...]
    
CRON_CLASSES = ["feed.cron.MyPurchaseCronJob",]

 

 

 

cron.py 에 스케줄과 code를 꼭!! 입력(없으면 실행 불가)하고, 실행하고자했던 반복 작업을 포함하는 함수를 생성한다. 

필요한 모델이 있다면 import해오고,  아래와 같이 원하는 시간을 스케줄링해준다.

 

from django_cron import CronJobBase, Schedule

class MyPurchaseCronJob(CronJobBase):
    RUN_EVERY_MINS = 5
    schedule = Schedule(run_every_mins=RUN_EVERY_MINS)
    code = "feed.my_purchase_job"

    def do(self):
    	pass

 

 

 

명령어로 cron을 실행하도록 한다

 

$ python manage.py runcrons

 

 

 

 

 


 

 

 

 

- django-crontab

 

settings.py와 cron.py에 패키지 설치를 알리고, 파일 위치와 함수 이름을 적어준다.

마찬가지로 cron.py에 하고자 하는 작업을 입력해주는데,

스케줄링은 settings.py에서 한다.

 

INSTALLED_APPS = [
    'django_crontab',
    ...]
    
CRONJOBS = [
    ('*/5 * * * *', 'myapp.cron.my_scheduled_job')
]

 

 

 

> 스케줄링 방법

앞부터 분 / 시간 / 날짜(1~31일) / 월 / 요일로 정해져있다

 

 # ┌───────────── min (0 - 59)
 # │ ┌────────────── hour (0 - 23)
 # │ │ ┌─────────────── day of month (1 - 31)
 # │ │ │ ┌──────────────── month (1 - 12)
 # │ │ │ │ ┌───────────────── day of week (0 - 6) (0 to 6 are Sunday to Saturday, or use names; 7 is Sunday, the same as 0)
 # │ │ │ │ │
 # │ │ │ │ │
 # * * * * *  command to execute

 

 

 

아래와 같이 다른 위치나 인수를 정의해줄 수 있다! (출처 : 공식문서)

 

# django 관리 명령의 호출 위치 및 키워드 인수를 정의할 수도 있다
CRONJOBS = [
    ('*/5 * * * *', 'myapp.cron.other_scheduled_job', ['arg1', 'arg2'], {'verbose': 0}),
    ('0 4 * * *', 'django.core.management.call_command', ['clearsessions']),
]

 

 

 

새로운 cron을 생성했으면 알려주는 add명령어를 사용해야한다.

 

$ python manage.py crontab add

 

 

이외에도 상태를 보고, 작업을 취소하는 명령어도 있다

 

$ python manage.py crontab show  # 활성 cron 확인
$ python manage.py crontab remove  # 활성 cron 삭제

 

 

 


 

 

 

당장 사용해본 것은 django-cron 뿐이어서

두 가지의 차이점은 스케줄링을 어디서 하느냐의 차이로 보인다.

 

 

 

전체적인 사용빈도는 crontab이 더 높은 것 같다!

아무래도 따로 스케줄링을 하는 것보다 settings.py에서 한번에 관리해주는 것이 편하기 때문인듯

 

구글링할때 cron은 거의 나오지 않는데, 아무래도 개발을 멈춘 영향이 있을 듯!

 

 

 

 

 

[cron & crontab 참고]

https://lunightstory.tistory.com/8

 

[공부하기] : 도커 환경에서의 cron 배포와 사용

https://jhkimmm.tistory.com/25