스케줄을 기반으로 하는 실행은 많은 프로그램에서 제공하는 방법중 하나이다.
여기에서는 Python을 이용해서 특장 시간이나 날짜로 주기적으로 반복 실행하는 3가지 방법에 대해서 알아보고자 한다.
1. datetime을 이용한 방법
가장 가볍게 사용할 수 있는 방법으로, datetime으로 실행하고자 하는 시간을 기록하고, 해당 시간이 되었는지를 확인하여 실행하는 방법이다.그리고 주기적인 실행을 위해서, 날짜라던가 실행한 값을 저장해 해당 값과 비교를 통해 이전 실행유무를 확인할 수 있다.
아래 코드는 매일 11시에 실행하는 코드이다.
import datetime
def scheduled_function():
# 실행하고자 하는 작업을 작성
print("매일 특정 시간에 실행되는 작업...")
# 실행하고자 하는 시간 설정 (24시간 형식, 0-23 사이의 값)
scheduled_hour = 11
while True:
# 현재 시간과 날짜 얻기
current_time = datetime.datetime.now()
current_hour = current_time.hour
current_date = current_time.date()
# 설정한 시간과 현재 시간, 날짜 비교
if current_hour == scheduled_hour:
# 실행 날짜 체크
if current_date != scheduled_date:
#현재 시간을 설정한 날짜로 저장
scheduled_date = current_date
# 작업 실행
scheduled_function()
else:
print("이미 실행된 작업.")
# 1분 동안 대기
time.sleep(60)
단점이라면, 정확한 시간(예 11:20 실행)과 같은 조건이 필요한 경우, 부정확하게 실행될 수 있으므로, 시간적으로 정밀하지 않아도 되는 경우에 많이 사용된다.
2. schedule 라이브러리를 이용한 방법
보다 정밀한 실행을 하고자 한다면, 라이브러리를 활용하는 것이 좋다.
Python에서는 schedule이라는 라이브러리를 제공하는데, 이를 이용하면, 지정된 시간에 실행하게 된다.
import schedule
def scheduled_function():
# 실행하고자 하는 작업을 작성
print("매일 특정 시간에 실행되는 작업...")
scheduled_time = '11:00'
schedule.every().day.at(scheduled_time).do(scheduled_function)
while True:
# 작업 스케줄 실행
schedule.run_pending()
# 1초 동안 대기
time.sleep(1)
3. 운영체제의 스케줄러를 활용하는 방법
마지막은 기존에 Python 프로그램을 이용한 방법이였다면, 운영체제에서 제공하는 Windows Task Scheduler와 cron과 같은 외부 스케줄링 도구를 활용하는 방법이다.
운영체제에서 제공하는 도구이기 때문에, 보다 정밀하고 운영체제가 문제가 발생하지 않는 이상 정해진 시간에 실행되어 가장 정밀한 구성이라고 할 수 있다.
Python에서는 운영체제의 스케줄링 도구를 조정할 수 있는데, Windows Task Scheduler의 경우 pywin32를 통해 가능하다.
만약 매일 11시에 실행하고자 한다면 다음과 같이 진행할 수 있다.
import win32com.client# 작업 이름과 실행할 Python 스크립트 경로 설정task_name = "My Daily Task"script_path = "C:\\path\\to\\asecurity_script.py"# Task Scheduler COM 객체 생성scheduler = win32com.client.Dispatch("Schedule.Service")scheduler.Connect()# 작업 생성root_folder = scheduler.GetFolder("\\")task_definition = scheduler.NewTask(0)task_definition.RegistrationInfo.Description = "My Python Task"task_definition.Settings.Enabled = Truetask_definition.Settings.Hidden = False# 작업 트리거 설정 (매일 특정 시간 실행)trigger = task_definition.Triggers.Create(0)trigger.DaysOfWeek = 127 # 매일 실행trigger.StartBoundary = "2023-07-11T11:00:00" # 실행 시간 설정# 작업 동작 설정 (Python 스크립트 실행)action = task_definition.Actions.Create(0)action.Path = "python.exe"action.Arguments = f'"{script_path}"'# 작업 등록tasks_folder = root_folder.GetFolder("\\Tasks")tasks_folder.RegisterTaskDefinition(task_name, task_definition, 6, "", "", 3)
Linux의 cron은 python-crontab을 통해 이용이 가능하다.
from crontab import CronTab# 사용자 cron 탭 열기cron = CronTab(user=True)# 작업 생성 및 설정job = cron.new(command='python /path/to/asecurity_script.py')job.setall('00 11 * * *') # 매일 11시에 실행# 작업 등록cron.write()
0 댓글