• 티스토리 홈
  • 프로필사진
    조별하
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
조별하
  • 프로필사진
    조별하
    • 분류 전체보기 (124)
      • 1. 공부 (0)
        • 기술 면접 (0)
      • 2. 웹개발 (7)
        • Java (1)
        • IT 정보 (5)
        • Error 모음 (1)
      • 3. 개인관심 (1)
        • 전자 (1)
      • GITHUB (5)
      • IT 기술 면접 (3)
      • COMPUTER (2)
      • TASK (1)
      • LANGUAGES (20)
        • Python (3)
        • Django (6)
        • Java (7)
        • Node (1)
        • Jsp (2)
        • R (1)
      • 데이터과학 (2)
        • 머신러닝 및 딥러닝 (2)
      • DATABASE (5)
        • Oracle (2)
      • ISSUE (10)
        • Django (4)
        • Drf (2)
        • Javascript (1)
        • Git (1)
      • JAVA 교육 (65)
        • Java (3)
        • Jquery (2)
        • Sql (16)
        • Jdbc (1)
        • Db (2)
        • Jsp (9)
        • myWeb (15)
        • Servlet (4)
        • Spring (12)
        • Crawling (0)
        • Hosting (1)
      • 정보처리산업기사 (1)
      • EDUCATION (2)
        • IoT 서비스 (2)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • [Django] django-crontab 스케줄러 작성
        2023년 05월 22일
        • 조별하
        • 작성자
        • 2023.05.22.:17

        🍃 Crontab

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

         

        즉, 원하는 시간에 원하는 작업을 수행할 수 있게 해주는 작업 스케줄러라고 보면 된다.

        예를 들어 장고에서 로그인을 했을 때, session으로 
        구현된 로그인이라면 django-session에 session정보가 
        저장되었다가 로그아웃하면 삭제가 된다. 
        
        하지만 브라우저가 닫히거나 만료시간이 지나게 되면 
        session정보는 유지되며 로그아웃 처리가 되기 때문에 
        계속되는 로그인 많아지면 불필요한 session 데이터가 쌓여 자리를 차지하게 된다.
        
        이때 특정 시간이 되면 만료가 된 session정보를 삭제해 줬으면 좋겠다.

        위의 기능을 대신 해주는 것이 바로 crontab!!이다.

         

        🌱 django-crontab 설치

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

        $ pip3 install django-crontab

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

         

         

        🌱 파일생성 및 코드

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

        ├── core
        │   ├── __init__.py
        │   ├── __pycache__
        │   ├── admin.py
        │   ├── apps.py
        │   ├── cron.py  <---------- 주기적으로 실행할 파일 cron.py
        │   ├── log
        │   ├── mergeLog
        │   ├── migrations
        │   ├── models.py
        │   ├── tests.py
        │   └── views.py
        import os
        import glob
        from django.contrib.sessions.models import Session
        from datetime import datetime
        
        def delete_sessions():
            # dir_path = "/log"
            # if not os.path.isdir(dir_path):
            #     os.makedirs(dir_path)
        
            sessions = Session.objects.all()
            for session in sessions:
                print("===================================")
                print(f"현재시간: {datetime.now()}", end=", ")
                print(f"만료시간: {session.expire_date}")
                if datetime.now() > session.expire_date:
                    session.delete()
                    print("Delete completely expire_date!")

        cron.py의 내용은 현재시간과 django-session에 만료 시간을 확인하여, 만료 시간이 현재보다 이전 즉 이미 만료된 session정보는 삭제하는 코드를 작성해 주었다.

         

        🌱 설정

        ➤ settings.py

        CRONJOBS = [
            ('*/1 * * * *', 'core.cron.delete_sessions', '>> '+ os.path.join(BASE_DIR, f'core/log/cron_{datetime.now().strftime("%Y-%m-%d")}.log')),
        ]

        settings.py로 돌아와서 위의 코드를 추가하자.

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

        내 cron의 경우 1분 간격으로 delete_sessions 함수를 실행하고 core/log/ 경로에 cron_{datetime.now().strftime("%Y-%m-%d")}.log이름을 가진 로그파일을 일자마다 쌓이게 설정을 해 주었다.

         

        ➤ 시간 설정
        여기서 cron의 개념을 짚고 넘어가자.


        (* * * * *)다섯 개의 작업 시간 단위가 존재하며, 왼쪽부터 순서대로 (분 시 일 월 요일)이다.
        분 : 0 - 59
        시 : 0 - 23
        일 : 1 - 31
        월 : 1 - 12
        요일 : 0 - 7(1-7은 월요일 - 일요일이고 0도 일요일이다.)

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

         

        ➤ 실행 프로그램 설정
        설정한 시간 ',' 다음에 'core.cron.delete_sessions'와 같이 특정 app.file_name.funtion_name을 입력하여 주기적으로 실행될 파일의 함수를 기술하자.

        ,는 &를 의미
        -는 기간, 동안을 의미
        */숫자 는 간격을 의미


        * * * * */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파일 실행

         

        🌱 실행

        터미널에서 manage.py 가 존재하는 위치에서 다음 명령어를 실행한다.

        $ python3 manage.py crontab add

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

        $ python3 manage.py crontab show

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

        $ python3 manage.py crontab remove

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

         

        🌱 결과

         

        core>log 안에 시간이 표시된 log 파일이 생성된 것을 확인 할 수 있었고,

         

         

        log파일 안에 내가 작성한 시간과 session이 삭제되었을 때 문구가 출력되는 것을 확인 하였다.

        저작자표시 (새창열림)

        'LANGUAGES > Django' 카테고리의 다른 글

        [Docker] docker-compose를 이용한 프로젝트 배포  (0) 2023.05.08
        [Django] 다양한 템플릿 태그  (0) 2023.05.04
        [Django] django-seed를 이용한 데이터 만들기  (0) 2023.05.03
        [Django] Django 커스텀 커맨드 만들기  (0) 2023.05.02
        [Django] debug_toolbar 사용하기  (0) 2023.04.06
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바