python으로 daemon scheduler 구현

ewillwin·2023년 1월 2일
0

TSMtech Record

목록 보기
21/39
post-thumbnail

Linux crontab 문제점

  • 데이터 자동 추가를 위해 linux crontab을 이용하려 했는데, 실행하고자 하는 crawling.py 파일에 외부 라이브러리가 많아서 그런지 (crontab 파일에 따로 library path를 추가해야 할듯?) crontab이 매달 실행 자체가 안됨
    -> python subprocess module과 apscheduler module을 이용하여 직접 schedular를 구현함

schedule.py file

import subprocess
from apscheduler.schedulers.background import BackgroundScheduler
import time
import sys
from pytz import timezone

def job_function():
    subprocess.run(args=[sys.executable, "/home/ubuntu/crawling.py"])

sched = BackgroundScheduler(timezone='Asia/Seoul')

job = sched.add_job(job_function, 'cron', minute=42, hour=16, day='last')
sched.start()

while True:
    time.sleep(1)
  • subprocess.run()을 통해 외부 python 파일을 실행할 수 있음
    - 일반 script가 아닌 python 파일의 경우, sys module을 호출하여 "args=[sys.executable, "실행시킬 .py 파일"]"와 같이 subprocess를 실행해야함 -> crawling.py 파일 실행
  • scheduler를 background에서 실행하기 위해 BackgroundScheduler()를 이용
    - default가 한국 시간이 아니기 때문에 timezone을 'Asia/Seoul'로 설정해야함
  • add_job()을 통해 실행시킬 job을 추가할 수 있는데, cron 형식으로 설정 가능 (day='last'는 해당 월의 말일이라는 뜻)

Linux Process 조작 명령어

  • nohup python3 -u schedule.py &
    - 위와 같은 형식의 명령어를 통해 "nohup"과 "&" 조합으로 세션 연결이 종료되더라도 schedule.py 파일이 background에서 실행되도록 함 (daemon 생성)
    • stdout이랑 stderr는 log 형식으로 nohup.out에 기록되는듯
  • daemon process 종료하는 법
    - ps -ef | grep schedule로 PID를 찾고, sudo kill -9 PID 실행하여 process 강제 종료 (kill -15는 필요한 자원 정리 후 종료 -> 종료 안될 수도 있음/ -9는 강제 종료)
profile
Software Engineer @ LG Electronics

0개의 댓글