django-crontab 환경 변수에서 여러 가지 걸림돌을 참조하지 못하면

django-crontab 환경 변수에서 여러 가지 걸림돌을 참조하지 못하면


django-crontab의 설정이 하루를 낭비해 비망록으로 미리 걸림돌을 남겼다.
특히 환경 변수 주변은 함정이 된다.

django-crontab은 무엇입니까?


django를 만지작거리고 있습니다. 정기적으로 실행하고 싶은 조작이 있다고 가정하십시오.
예를 들어'데이터베이스에 1년 이상 보관된 데이터를 버려라'는 처리다.
일반적으로 정기적으로 실행할 때cron을 사용하지만python에서 멀리 떨어져 설정해야 하고django 사용자 정의 명령을 만드는 시간도 존재한다.
cron 설치만 완료하면 정기적으로 쉽게 실행할 수 있습니다. 이것은django-crontab이라는 프로그램 라이브러리입니다.
다만, 오류가 발생하면django의 오류,crontab의 오류, 정기적으로 작업을 수행하는 오류 등을 구분하기 어렵다.

발목을 잡다


사람이 걸려 넘어진 곳을 자꾸 열거하다.

설치 및 시작


환경에 따라cron을 설치할 수 있습니다.
항상 기본 설치와 유효성이 있다고 생각하지만 설치와 유효성이 필요하다.
Docker file의 경우 다음 두 행을 추가해야 합니다.
RUN apt-get update
RUN apt-get install -y cron
그 밖에 용기가 시작된 후에 실행해야 한다service cron start.
명령이나 신청점으로 기재하세요.

print 내보내지 않기


테스트print("hello")에만 사용되는 함수를 정기 작업으로 등록하면 표준 출력으로 표시되지만 이런 일은 일어나지 않습니다.
출력 결과를 확인하려면 작업에 로그인할 때 출력 목표 파일을 로그 파일로 지정해야 합니다.
CRONJOBS = [
    ("* * * * *", "d_party.cron.my_scheduled_job", ">> /var/log/cron.log"),
]
또한 시험적으로 사용한 오류 결과를 확인하고 싶을 때setting.py에 suffix를 추가해야 합니다.
CRONTAB_COMMAND_SUFFIX = "2>&1"

실행 중인 디렉터리가 다르면 import 할 수 없습니다


이 문제는 등록된 명령을 복사하고 실행하면 이동하지만 정기적으로 실행하면 오류가 발생하는 원인 중 하나입니다.
crontab에서 루트 사용자의 홈 페이지에서 실행됩니다.
루트 사용자의 홈 디렉터리 이외에django 프로젝트를 마운트할 때 import을 제대로 할 수 없습니다.
환경 변수의 PYTHONPATH에 디렉토리를 등록하는 등의 회피 방법이 있다.
dockerfile로 진행하면 다음과 같은 방식으로 설정 디렉터리에 로그인할 수 있습니다.
ENV PYTHONPATH /usr/src/app

환경 변수를 참조할 수 없습니다.


이 문제는 등록된 명령을 복사하고 실행하면 이동하지만 정기적으로 실행하면 오류가 발생하는 이유 중 하나입니다.
python에 환경 변수를 참조하는 코드를 쓰면cron에서 실행할 때 환경 변수를 참조할 수 없는 문제가 발생합니다.
이것은django-crontab과django가 일으킨 문제가 아니라cron의 규격에 의한 문제이다.
최소한의 환경 변수만 설정된 셸에서 실행됩니다.
나는 모든 환경이 바꿔야 할 값이 settings라고 생각한다.py에 직접 쓰지 마세요.env 파일로 미리 쓰기, Docker file 및 docker-compose.컨테이너의 환경 변수, settings를 Yml로 설정합니다.py에서 환경 변수를 설정 변수로 읽는 방식을 사용합니다.
django-crontab에서 이settigs는django 환경에서 변수를 실행할 수 있습니다.py와 관리자.py를 실행하는 중입니다.
환경 변수를 읽는 부분이 있으면 제대로 작동하지 못하는 문제가 발생할 수 있습니다.
저는 django-dotenv,manage를 사용합니다.py에서 환경 변수를 읽는 방식을 사용합니다.
이렇게 하면cron을 실행할 때 환경 변수도 자동으로 설정됩니다.
+import dotenv

def main():
+   dotenv.load_dotenv("/env_files/.env.django", verbose=True, override=True)

주의점으로 env파일 경로를 루트에서 쓰는 것을 권장합니다.
아까 말한 것처럼 루트 사용자의 홈 디렉터리에서 실행되기 때문에 예상치 못한 부작용이 발생하지 않습니다.

총결산


여러 가지 좌절점이 있지만 오류와 print를 확인할 수 있도록 설정한 뒤 오류를 줄여야 한다고 생각합니다.
이 기사에서 여러분의 걸림돌이 조금 줄어들 수 있다면 기쁘겠습니다.

좋은 웹페이지 즐겨찾기