Django_Crontab 사용하기, 정해진 시간에 맞춰 함수 실행하기

2024. 5. 9. 21:51카테고리 없음

crontab

  • crontab은 서버 내의 특정 작업(또는 명령)을 특정 주기로 스스로 실행하도록 하는 것을 뜻한다.

 

 

0. 내가 하고싶은 것

  • 자정이 될 때마다 포인트 차감하기

 

1. 크론탭 세팅하기

  • 1. 크론탭 설치하기
pip install django-crontab
  • 2. settings.py에 앱 등록하기
#settings.py
INSTALLED_APPS = (
    'django_crontab', 
)
  • 3. 앱 안에 cron.py 만들기

나 같은 경우 post앱 안에 cron.py를 만들었다.

 

  • 4. cron.py에다가 실행하고 싶은 함수 만들기
    • 예를 들어서, 나는 포인트를 차감하고 싶기 때문에 포인트 차감 함수를 만들었다.
     

코드에 대해 짧게 설명하자면,
spartanews모델을 조회하고 for문으로 돌면서 point를 조회해서 5포인트 차감하고 저장!

 

 

  • 5. settings.py에 실행할 시간 설정해주고 함수 위치 알려주기
#settings.py
CRONJOBS = [
    ('* * * * *', 'post.cron.update_news_point')
]

post.cron.update_news_point 는 함수 위치를 알려준다.(post 앱 안에 cron.py안에 update~~~함수)

  • 5-1. * * * * *은 시간을 나타낸다. 
    • 분(0-59) 시(0-23) 일(1-31) 월(1-12) 요일(0-6)
    • 아무것도 추가하지 않고 * * * * * 로 할시 1분 간격으로 실행되도록 기본 설정되어있음.
  • 5-2.    ,  -  /  을 적용하면 다양하게 쓸 수 있다 
    • ,는 &를 의미 
#settings.py
CRONJOBS = [
    ('* 1,5 * * *', 'post.cron.update_news_point')
]
#매일 1시와 5시에 실행
  • -는 기간, 동안을 의미
#settings.py
CRONJOBS = [
    ('0-30 3 * * *', 'post.cron.update_news_point')
]
#매일 3시에 정각부터 30분간 실행
  • */숫자 는 간격을 의미
#settings.py
CRONJOBS = [
    ('*/5 * * * *', 'post.cron.update_news_point')
]
#5분간 실행

 

2. 크론탭 사용해보기

크론탭 설치, 함수 만들기, settings.py에 설정 추가해주기를 마쳤다면

이제 명령어를 사용해서 크론탭이 잘 사용되는지 보자!

(당신이 맥 사용자이고, add를 했을 때 실행이 안 된다면, 밑에 "4. 오류해결하기" 먼저 보고오자)

 

# 크론탭 실행하기
python manage.py crontab add

실행한 모습

코드가 복잡해보이지만 다 볼 필요는 없고 'adding cronjob :'

여기 다음부분만 보면된다.  내가 settings에다가 만들어준 cronjob 코드가 그대로 적혀있다면 잘 실행 되고 있는 것!

 

# 실행한 크론탭 제거하기(사용 중지하기)
python manage.py crontab remove

제거한 모습

remove도 마찬가지로 removing cronjob: 다음부분에 코드가 잘 적혀있다면 잘 제거가 된 것이다.

 

# 실행 중인 크론탭있나 확인하기
python manage.py crontab show

잘 실행이 됐는지, 잘 제거가 됐는지 궁금하다면 show를 해서 볼 수도 있다.

add 하고 show한 모습
remove하고 show한 모습

두 개 사진의 코드를 일일히 볼 필욘 없다.

그냥 currently active job in crontab: 옆에 내 코드가 나와있는지 아닌지만 보면 된다.

나는 add, remove를 하고 나서 잘 작동하는지 보기 위해 항상 show로 확인하는 편이다.

 

3. 추가 꿀팁:  함수 실행 동시에 log기록도 함께 남기기

위의 코드만 해도 충분히 작동은 되겠지만 이게 잘 되고 있는지 안 되고 있는지 확인할 방법이 없다.

그래서 나는 log도 같이 찍어주는데, log를 추가하는 방법은 간단하다.

아까 settings.py에 같이 넣어주면 된다. 

CRONJOBS = [
    ('*/5 * * * *', 'post.cron.update_news_point', '>> /Users/t2023-m0088/Desktop/sparta_news/data.log')
]
#시간, 함수위치, 어느 위치에 log가 생길지 절대경로로 알려줌

log이름은 아무렇게나 설정해주면 되고,

log가 어디 생기는지는 알아야하니, 앱이 있는 절대경로 위치를 설정해주었다

 

 

밑에 사진은 아까만든 함수인데, print('포인트가 차감되었습니다.') 이 부분이 로그에 찍히게 될 것이다.

 

 

 

원랜 아무것도 없었지만,

 

 

 

1분이 지나자 data.log가 자동으로 생긴 걸 볼 수 있다.

 

 

그리고 data.log에 들어가보면??? 

포인트가 차감되었습니다 라는 말이 잘 찍혀있다!

 

언제 차감됐는지 알고 싶다면 현재시각도 같이 넣어주면 된다.

cron.py를 조금 수정한 후 크론탭을 실행해보자

datetime을 불러와서 now값에 담은 후 print에 now를 추가해주었다.

 

이렇게 차감됨과 동시에 시간이 같이 찍혀져나오는 걸 볼 수 있다!

 

 

 

 

 

4. 오류해결하기 (맥 사용자만 해당)

add를 했는데도 크론탭이 실행이 안 되는 오류가 있었다. 

이리저리 해보다가 결국 해결했는데, 

 

권한 문제 때문이었다.

 

  • 맥 설정 
  • -> 개인정보 보호 및 보안 
  • -> 전체 디스크 접근 권한 
  • -> + 버튼 누르고 vscode찾아서 추가하기

  • -> + 버튼 누르고 command+shift+g 누르고 /usr/sbin/cron 치고 누르기

 

cron누르고 열기 누르면 됨!!!!!!!

 

 

 

  • cron과 vscode추가 했으면 접근권한 켜주기

  • vscode껐다가 다시 켜기

 

 

 

나는 이렇게 해서 오류 해결했다...

맥... 정말 ^^ 너 보안이 너무 좋아 ^^^^^^^^

 

 

 

 

 

 

다들 내 게시글이 도움이 됐길 바라며! 
질문은 댓글로! 공감도 부탁혀~~~