[TIL] django cron / crontab
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