TIL | Django - crontab 사용하기

송치헌·2021년 9월 19일
2

TIL | Wecode - Django

목록 보기
18/18
post-thumbnail

⏰crontab이 뭐야?


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

쉽게 얘기해서 원하는 시간에 원하는 작업을 수행하게끔 해주는 작업 스케줄러라고 보면 된다.

예를 들어서 매일 밤 10시만 되면 배가 고픈 나는 
항상 10시에 배달의 민족에 들어간다고 가정하자(가정이 아닐 수도 있다.)

그런데 매일마다 배달의 민족에 들어가는게 너무 귀찮아서 
자동으로 밤 10시만 되면 배달의 민족 앱이 켜졌으면 좋겠다. 

그 기능을 대신 해주는 것이 바로 🎊crontab!!

이 강력한 crontab 기능을 무려 django에서도 쓸 수 있다.

🔎django-crontab 설치


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

pip install django-crontab

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

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

나의 경우에는 config/cron.py으로 만들었다.
⚠️잘 모르겠으면 그냥 settings.py와 같은 위치에 생성하자⚠️

my_project
ㄴconfig
  ㄴ__init__.py
  ㄴsettings.py
  ㄴurls.py
  ㄴcron.py  <-- 'Here's my sweety cron🐥'
ㄴapp1
ㄴapp2
ㄴapp3


cron.py의 내용이다. 나는 일단 현재 진행중인 프로젝트에다가 적용시켜 보았다. 아무 테이블이나 불러와서 첫번째 객체를 삭제시키는 작업을 할 것이다. 아래는 log파일에 찍히는 내용들이다.

다 작성했으면 다시 settings.py로 돌아가서 다음을 추가하자.

여기서 잠깐 cron의 개념을 짚고 넘어가자면

(* * * * *) 다섯 개의 작업 시간 단위가 있다.
왼쪽부터 순서대로 (분 시 일 월 요일) 이다.

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

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

📆몇가지 예제


  • ,는 &를 의미
  • -는 기간, 동안을 의미
  • */숫자 는 간격을 의미
  • * * * * * /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파일 실행

✅ django에 crontab 적용하기


다시 django로 돌아와서

위에서 본 이 코드의 의미는

({작업 시간 단위}, {실행할 파일, 작업, 행동 등}, {작성할 Log 파일}) 이다.

내 cronjob의 경우 1분 간격으로 DeleteFirstObject라는 파일을 실행하고 schedule.log파일에 저장한다는 의미이다.

모든 준비가 완료되었다.

터미널에서 manage.py가 존재하는 위치로 이동해서 다음 명령어를 입력해보자.

python manage.py crontab add

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

python manage.py crontab show

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

python manage.py crontab remove

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

🧩 결과



크론들이 작업해 줄 파일 코드이다. django ORM을 실행해 줄 것이고 삭제가 되었다는 문구와 삭제된 시간을 출력할 것이다.

1분 마다 테이블의 객체 하나씩 지우도록 설정해 놓고 딴 짓하고 돌아왔는데 싹다 먹어 치웠다....ㅠㅠㅠㅠ

나의 로그 파일이다. 고생한 나의 크론에게 박수를 보내고 희생당한 나의 테이블 데이터들에게 조의를 표하며 글을 마친다.

profile
https://oraange.tistory.com/ 여기에도 많이 놀러와 주세요

0개의 댓글