윈도우 작업 스케줄러로 스크립트 자동 실행 설정하기

파이썬 스크립트를 아무리 잘 만들어도 매번 직접 실행 버튼을 눌러야 한다면 반쪽짜리 자동화입니다. 진짜 자동화는 사람이 손대지 않아도 정해진 시간에, 정해진 조건에서 스스로 실행되는 것이죠. 윈도우 사용자라면 별도의 프로그램을 설치할 필요 없이 기본 내장된 작업 스케줄러만으로 충분합니다. 오늘은 작업 스케줄러 파이썬 자동 실행 설정 방법을 처음부터 끝까지 정리하고, 이 블로그의 글을 매일 예약 발행하는 노트북에서 실제로 걸렸던 함정들을 함께 적었습니다(2026년 10월 보강).

준비물 확인하기

가장 먼저 파이썬이 명령 프롬프트에서 정상적으로 실행되는지 확인해야 합니다. cmd를 열고 python --version을 입력했을 때 버전이 출력되지 않는다면, 파이썬 설치 시 “Add Python to PATH” 옵션을 체크하지 않았을 가능성이 큽니다. 버전이 나오더라도 where python도 한 번 쳐 보세요. 이 노트북에서는 두 줄이 나왔습니다.

C:\Users\사용자\AppData\Local\Programs\Python\Python312\python.exe
C:\Users\사용자\AppData\Local\Microsoft\WindowsApps\python.exe

두 번째 줄은 진짜 파이썬이 아니라 마이크로소프트 스토어로 연결되는 별칭입니다. 작업 스케줄러가 주는 PATH 순서가 평소 터미널과 다르면 이쪽이 먼저 잡힐 수 있습니다. 그래서 무인 실행에서는 python 대신 첫 줄처럼 전체 경로를 쓰는 편이 안전합니다. 실제로 매일 발행을 돌리는 러너 스크립트도 실행 전에 PATH 맨 앞에 Python312 폴더를 직접 넣고 시작합니다.

배치 파일(.bat)로 감싸기

작업 스케줄러는 스크립트 파일을 직접 실행하기보다, 배치 파일을 거쳐 실행하는 방식이 훨씬 다루기 쉽습니다. 메모장을 열어 아래 내용을 작성하고 스크립트와 같은 폴더에 run_script.bat로 저장합니다.

@echo off
cd /d "%~dp0"
python organize.py >> log.txt 2>&1

%~dp0은 “이 bat 파일이 있는 폴더”라는 뜻이라, 폴더 경로를 직접 적지 않아도 됩니다. cd /d로 작업 폴더를 먼저 옮기는 이유는 스크립트 안에서 상대경로를 쓸 경우 실행 위치가 달라지면 오류가 나기 때문입니다. 뒤에 붙인 >> log.txt 2>&1은 실행 결과와 오류 메시지를 모두 로그 파일에 기록해 두는 부분으로, 나중에 문제가 생겼을 때 원인을 파악하는 데 큰 도움이 됩니다. 처음 글에는 cd /d "C:\Users\사용자명\..."처럼 경로를 직접 적는 예를 들었는데, 이 방식은 아래에서 보듯 한글 경로에서 깨질 수 있어 바꿨습니다.

작업 스케줄러 등록 단계

  1. 시작 메뉴에서 “작업 스케줄러”를 검색해 실행합니다.
  2. 오른쪽 패널에서 “기본 작업 만들기”를 클릭합니다.
  3. 작업 이름과 설명을 입력합니다. (예: “다운로드 폴더 자동 정리”)
  4. 트리거를 선택합니다. 매일, 매주, 로그온할 때 등 원하는 조건을 고를 수 있습니다.
  5. 시작 시간을 지정합니다. 예를 들어 매일 오전 9시로 설정하면 컴퓨터가 켜져 있을 때 자동으로 실행됩니다.
  6. “프로그램 시작”을 선택하고, 프로그램/스크립트 칸에 앞서 만든 run_script.bat의 전체 경로를 입력합니다. 같은 화면의 “시작 위치(옵션)” 칸에 스크립트 폴더를 적어 두면 한 번 더 안전합니다.
  7. 마지막 화면에서 설정을 검토하고 완료를 클릭합니다.

놓치기 쉬운 세부 설정

기본 설정만으로는 몇 가지 문제가 발생할 수 있습니다. 등록된 작업을 더블클릭해 속성 창을 열고 아래 항목들을 확인해보세요.

  • 사용자가 로그온했는지 여부와 상관없이 실행: 체크하지 않으면 로그아웃 상태에서는 작업이 실행되지 않습니다. 대신 이 옵션을 켜면 창이 보이지 않는 별도 세션에서 돌기 때문에, 화면에 무언가를 띄우는 스크립트는 맞지 않습니다.
  • 가장 높은 권한으로 실행: 파일 시스템 접근 권한 문제가 있을 때만 켜세요. 이 노트북의 작업은 일반 권한(Limited)으로도 문제없이 돌고 있습니다.
  • 조건 탭의 “AC 전원에 연결된 경우에만” 옵션 해제: 노트북에서 배터리로 작동 중에도 실행되게 하려면 해제해야 합니다. 기본값이 켜져 있어서 노트북에서 “가끔 안 돈다”는 증상의 단골 원인입니다.
  • 설정 탭의 “예약된 시작 시간을 놓친 경우 최대한 빨리 작업 시작”: 컴퓨터가 꺼져 있던 시간에 예정된 작업이 있었다면 켜지자마자 실행되도록 해줍니다.

실제로 쓰는 설정값

이 노트북에는 정기 작업이 여러 개 있지만, 작업 스케줄러에는 일부러 하나만 등록해 두었습니다. 15분마다 깨어나는 작은 디스패처가 “지금 돌 차례인 작업”을 골라 한 번에 하나씩 실행하는 구조입니다. 작업마다 따로 등록하면 같은 시각에 겹쳐 돌거나, 같은 일이 두 번 등록되는 일이 생겨서 이렇게 바꿨습니다. 그 작업의 설정을 PowerShell로 읽어 보면 다음과 같습니다(읽기만 하는 명령입니다).

$t = Get-ScheduledTask -TaskName automation-hub
$t.Settings | Select-Object StartWhenAvailable, DisallowStartIfOnBatteries, StopIfGoingOnBatteries, ExecutionTimeLimit, MultipleInstances
$t | Get-ScheduledTaskInfo | Select-Object LastRunTime, LastTaskResult, NumberOfMissedRuns
항목값의미
트리거15분 반복 + 로그온 시켜져 있는 동안 계속 확인
StartWhenAvailableTrue놓친 시각은 켜진 뒤 따라잡기
DisallowStartIfOnBatteriesFalse배터리에서도 실행
StopIfGoingOnBatteriesFalse충전기 뽑아도 안 멈춤
ExecutionTimeLimitPT6H6시간 넘으면 강제 종료
MultipleInstancesIgnoreNew이전 실행이 안 끝났으면 새 실행 무시
LastTaskResult0마지막 실행 정상

MultipleInstances는 화면의 설정 탭 맨 아래 “작업이 이미 실행 중이면 다음 규칙 적용”입니다. 15분마다 깨어나는 작업에서 한 번이 20분 걸리면 두 개가 동시에 돌게 되는데, IgnoreNew로 두면 겹치지 않습니다.

22일 동안 실제로 돌아간 기록

매일 10:00에 블로그 예약 발행을 돌리는 작업의 2026년 10월 8일부터 29일까지 22일치 로그를 세어 봤습니다. 20일은 10:00:02~03에 시작해 4~13분 만에 정상 종료(exit 0)했습니다. 10월 17일은 그 시각에 노트북이 꺼져 있었고, 밤 23:01에 켜지자마자 첫 확인에서 따라잡아 정상 종료했습니다. “놓친 경우 최대한 빨리 시작”을 켜 둔 효과가 이것입니다. 10월 19일은 10:34에 시작한 뒤 종료 기록 없이 끊겼고, 10분 뒤 디스패처가 “남은 잠금 파일 회수 (PID 없음)”를 남겼습니다. 프로세스가 중간에 사라진 것인데 원인은 로그에 남지 않았습니다. 이런 날이 있기 때문에 스크립트가 시작과 종료를 각각 로그에 적게 해 두면, “종료” 줄이 없는 날만 골라 보면 됩니다.

직접 재현해 본 함정 두 가지

① cd를 빼면 엉뚱한 폴더에서 돕니다. 같은 폴더의 config.txt를 읽는 job.py를 만들고, 이를 부르는 bat을 다른 폴더에서 실행해 봤습니다. 작업 스케줄러에서 “시작 위치”를 비워 두면 비슷한 상황이 됩니다. cd 줄이 없으면 python: can't open file '...\other\job.py': [Errno 2] No such file or directory로 exit 2가 났고, 더 곤란하게도 log.txt가 프로젝트 폴더가 아니라 호출한 폴더에 생겼습니다. 로그를 열어 봐도 비어 있어서 “아무 일도 없었다”고 착각하기 쉽습니다. cd /d "%~dp0"을 넣자 exit 0이었고 로그도 제자리에 남았습니다.

② bat 파일에 한글 경로를 적으면 저장 인코딩에 따라 갈립니다. 이 노트북의 프로젝트 폴더는 이름이 한글입니다. 한글 폴더로 이동하는 bat을 두 가지로 저장해 같은 명령 프롬프트(코드 페이지 949)에서 돌려 봤습니다.

bat 내용저장 인코딩결과
cd /d "...\한글폴더"UTF-8“파일 이름, 디렉터리 이름 또는 볼륨 레이블 구문이 잘못되었습니다.” → exit 2
cd /d "...\한글폴더"CP949(ANSI)정상, exit 0
cd /d "%~dp0한글폴더"UTF-8실패, exit 2
한글 폴더 안에 두고 cd /d "%~dp0"만UTF-8정상, exit 0

요즘 편집기는 대부분 UTF-8로 저장하기 때문에, 경로를 직접 적은 bat은 편집기에서 멀쩡해 보여도 실행하면 깨집니다. 가장 간단한 해결은 마지막 줄처럼 bat 안에 한글을 아예 쓰지 않고 %~dp0에 맡기는 것입니다. PowerShell 스크립트(.ps1)도 비슷한 문제가 있습니다. 발행 러너를 BOM 없는 UTF-8로 저장했던 날, PowerShell 5.1이 한글을 깨뜨리고도 오류 없이 exit 0으로 조용히 끝난 사고가 있었습니다(2026년 8월). 결과 코드가 0이라 작업 스케줄러에서는 성공으로 보였습니다. 그 뒤로 .ps1은 반드시 “UTF-8 BOM”으로 저장합니다.

정상 작동 확인하기

작업 스케줄러 Last Result 1 오류와 CRLF 줄바꿈 해결 과정
실제로 겪은 사고입니다. 등록은 됐는데 Last Result가 1이었고, 원인은 bat 파일이 LF 줄바꿈이라 cmd가 명령을 토막낸 것이었습니다. CRLF로 저장하니 0이 됐습니다.

설정을 마쳤다면 실제 예약 시간까지 기다리지 않고 바로 테스트할 수 있습니다. 작업 목록에서 해당 작업을 우클릭한 뒤 “실행”을 선택하면 즉시 동작하며, 앞서 만든 log.txt 파일을 열어 정상적으로 실행됐는지 확인하면 됩니다. “마지막 실행 결과”가 0이 아니면 그 숫자가 스크립트의 종료 코드입니다. 위 재현에서처럼 파이썬이 파일을 못 찾으면 2, bat 안 명령이 실패하면 1이 흔합니다.

마무리

작업 스케줄러는 별도 비용이나 추가 프로그램 없이도 파이썬 자동화를 완성하는 마지막 퍼즐입니다. 다만 등록보다 중요한 것은 “안 돌았을 때 알아채는 방법”입니다. 실행 폴더는 %~dp0으로 고정하고, 파이썬은 전체 경로로 부르고, 시작과 종료를 로그에 남겨 두면 위에서 본 함정 대부분을 피하거나 바로 찾을 수 있습니다.