์ƒˆ์†Œ์‹

LANGUAGES/Django

[Django] django-crontab ์Šค์ผ€์ค„๋Ÿฌ ์ž‘์„ฑ

  • -

๐Ÿƒ 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์ด ์‚ญ์ œ๋˜์—ˆ์„ ๋•Œ ๋ฌธ๊ตฌ๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธ ํ•˜์˜€๋‹ค.

Contents

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.