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는 강제 종료)