Django - Crontab (Mac OS)
리눅스 환경에서는 일정 시간마다 반복 작업을 할 수 있도록 crontab이라는 기능을 제공하는데, django 역시 이 기능을 사용할 수 있다.
그러나 crontab은 리눅스 환경에서만 지원되는 것이고, 장고는 crontab 스케줄러에 일을 추가해주는것 뿐이므로 윈도우에서는 사용할 수 없다.
사용법은 간단하다.
1. 모듈 설치
pip install django-crontab
2. 반복 작업을 위한 함수 생성
def reset_daily_view():
print("reset daily_view")
movies = Movie.objects.filter(status=STATUS_ACTIVE)
movies.update(
daily_view=0,
last_update_date=timezone.now()
)
필자는 위와 같이 Active 상태의 Movie 레코드들의 일간 조회수(daily_view)를 0으로 초기화 하는 함수를 작성했다.
경로는 swe(app 이름).cronjobs.py 이며, 해당 함수가 돌 때마다 reset daily_view를 찍도록 했다.
3. Cronjobs 추가
CRONJOBS = [
('* * * * *', 'swe.cronjobs.reset_daily_view', ">> " + LOG_ROOT + "reset_daily_view_cronjob.log"),
]
위와 같이 settings.py 에 CRONJOBS를 추가하여 어떤 함수를 반복 작업할 것인지 명령하게 된다.
작성 방법은 반복 주기, 함수, 로그 파일 순서이다.
반복 주기는 앞에서 부터 분 시 일 월 요일 에 해당하며,
분(0 - 59) 시(0 - 23) 일(1 - 31) 월(1 - 12) 요일(0 - 6) (0:일요일, 1:월요일, 2:화요일, …, 6:토요일) 의 기준을 따른다.
자세한 사용법은 https://brownbears.tistory.com/15 에 잘 나와있다.
함수는 앱.파일.함수 의 순서에 맞게 경로만 잘 지정해주면 된다.
가장 오른쪽의 로그파일은 Crontab을 사용할 때는 거의 필수적인 것이, 함수 내의 print문과 같은 출력물이 터미널에 표기되지 않고 지정한 로그 파일에 쌓이기 때문이다. 함수가 잘 돌고 있는지 모니터링 하기 위해서는 로그 파일을 정해주는 것이 필수적이다.
4. 실행
python manage.py crontab add
python manage.py crontab show
python manage.py crontab remove
실행을 위한 명령어는 간단하다.
add 로 추가하고, show로 확인하고 remove로 삭제한다.
추가적으로, os에 어떻게 등록되어 있는지 보려면 crontab -l 을 사용하여 볼 수 있고, crontab -e 를 통해 편집할 수도 있다.
꿀팁
사실 이 부분이 글을 쓴 가장 큰 목적이다.
필자는 mac 을 사용하고 있는데, 설정을 옳게 해도 실행이 되지 않는 것이었다.
구글링 끝에, 오류의 원인을 찾게 해주는 옵션을 알아냈다.
CRONTAB_COMMAND_SUFFIX = '2>&1'
해당 코드를 settings.py 에 작성하면, crontab이 오류를 낼 때 위에서 지정한 로그 파일에 로그가 쌓이게 되어 디버깅을 돕는다.
/Library/Frameworks/Python.framework/Versions/3.8/bin/python3: can't open file '/Users/jihoon/Downloads/SWE/main-svr/backend/manage.py': [Errno 1] Operation not permitted
원인은 위와 같이 권한 문제였고, chmod +x로 권한을 줘도 문제가 해결되지 않았다.
보통의 경우이면 sudo 를 사용하면 되지만 시스템이 작업해주는 것이기 때문에 sudo 옵션을 사용할수가 없었다.
많은 mac 사용자들이 해당 문제를 겪고 있는것처럼 보였는데, 해결법은 다음과 같다.
usr/sbin/cron 에 Full Disk Access를 주면 해결된다.
보안적인 측면에서 썩 좋은 방법은 아니라고 하지만, 현재로서는 이 방법 뿐인듯 하다 ㅜ