작업 스케줄러가 밤에만 안 도는 이유 (15시간 공백 실측)

Windows 작업 스케줄러가 낮에는 멀쩡한데 새벽 작업만 계속 빠져 있다면, 실패한 게 아니라 아예 실행되지 않은 겁니다. 마지막 결과가 0x0인데도 결번이 생기는 이유와, 제 서버에서 15시간이 통째로 비었던 기록을 그대로 정리했어요.

작업 스케줄러가 밤에만 안 도는 이유 (15시간 공백 실측)

Windows 작업 스케줄러를 쓰다 보면 이상한 상황을 만납니다. 낮에는 잘 도는데 새벽 작업만 계속 비어 있는데, 로그에는 실패가 하나도 없는 경우요.

저도 그랬습니다. 원인을 잡고 보니 실패가 아니라 아예 실행되지 않은 것이었어요. 실패는 기록이 남지만, 미실행은 기록이 안 남습니다. 그래서 감시 도구로도 안 잡힙니다.

제 서버에서 실제로 15시간이 비었던 기록을 그대로 정리했습니다.

먼저 결론

증상실제 원인확인할 설정
밤 회차만 결번PC 절전 + 놓친 회차 미복구StartWhenAvailable
예약 시각에 아예 안 깸절전에서 안 깨움WakeToRun
마지막 결과가 계속 0x0미실행은 결과를 안 남김LastRunTime 간격

핵심은 LastTaskResult만 보면 절대 못 잡는다는 겁니다.

실측 — 3시간 주기인데 15시간이 비었다

제 수집 작업은 3시간 주기로 돌게 돼 있습니다. 그런데 산출물 시각을 나열해 보니 이랬습니다.

산출 시각간격
2026-08-25 11:48—
2026-08-25 14:493시간
2026-08-25 20:496시간 (한 번 결번)
2026-08-26 11:4815시간 (네 번 연속 결번)

23시, 02시, 05시, 08시 회차가 통째로 없습니다. 그런데 작업 상태는 Ready, 마지막 결과는 0x0이었어요. 성공으로 보였습니다.

이유는 단순합니다. LastTaskResult는 마지막으로 실행된 회차의 결과입니다. 실행 자체가 안 된 회차는 결과를 남기지 않으니, 밤새 네 번을 건너뛰어도 표시는 어제 낮의 성공 그대로입니다.

확인하는 법

PowerShell로 설정 두 개를 먼저 봅니다.

$t = Get-ScheduledTask -TaskName "작업이름"
$t.Settings.StartWhenAvailable   # False면 놓친 회차를 복구하지 않음
$t.Settings.WakeToRun            # False면 절전에서 안 깨움

제 경우 둘 다 False였습니다. 즉 PC가 자면 그 시간대 회차는 그냥 사라지는 구조였어요.

간격으로 결번을 잡는 것도 같이 해두면 좋습니다. 결과값이 아니라 산출물 시각의 간격을 보는 쪽이 정확합니다.

Get-ScheduledTask -TaskPath "\내폴더\" | ForEach-Object {
  $i = $_ | Get-ScheduledTaskInfo
  "{0,-22} SWA={1,-5} last={2} res=0x{3:X}" -f `
    $_.TaskName, $_.Settings.StartWhenAvailable, $i.LastRunTime, $i.LastTaskResult
}

고치기 — 두 설정의 성격이 다릅니다

StartWhenAvailable을 켜면 이렇게 바뀝니다.

$t = Get-ScheduledTask -TaskName "작업이름"
$s = $t.Settings
$s.StartWhenAvailable = $true
Set-ScheduledTask -TaskName $t.TaskName -TaskPath $t.TaskPath -Settings $s

작업이 폴더 안에 있으면 -TaskPath를 반드시 같이 넘겨야 합니다. 안 그러면 이름만으로는 못 찾고 이런 오류가 납니다.

Set-ScheduledTask : The system cannot find the file specified.
HRESULT 0x80070002

$t.TaskPath 값을 그대로 넘기면 해결됩니다.

두 설정의 차이는 이렇게 나뉩니다.

  • StartWhenAvailable — 놓친 회차를 PC가 깨어난 뒤 따라잡아 실행합니다. 지연 복구입니다. 정시성은 포기하는 대신 PC를 건드리지 않습니다.
  • WakeToRun — 예약 시각에 절전에서 PC를 깨웁니다. 정시 실행입니다. 대신 새벽에 팬이 돕니다.

저는 StartWhenAvailable만 켰습니다. 밤에 기계를 깨우는 건 별개 결정이라고 봐서요. 이러면 새벽 회차는 여전히 밀리지만, 아침에 PC를 켜는 순간 밀린 회차가 복구됩니다.

곁들여 — 주기가 곧 반응 속도입니다

같은 날 하나 더 걸렸습니다. 텔레그램 승인 버튼을 눌러도 반응이 없다고 몇 번을 확인했는데, 고장이 아니었어요.

버튼 응답을 처리하는 주체가 30분 주기 작업이었습니다. 누른 시각이 10:30:12, 직전 실행이 10:30:02. 10초 차이로 놓쳐서 다음 처리는 11:00이었습니다.

“접수했습니다” 응답은 즉시 오는데 결과가 30분 뒤에 나오니 고장으로 보일 수밖에 없습니다. 실제로 그래서 25번을 눌러도 통과가 0건이었어요.

해결은 간단했습니다. 처리 전용 작업을 5분 주기로 따로 만들고, 기존 30분 작업은 생성·발송만 맡겼습니다. 한 작업에 무거운 일과 반응이 필요한 일을 같이 두지 않는 쪽이 낫습니다.

정리

  1. 밤 회차만 비면 실패가 아니라 미실행을 의심하세요. 결과값으로는 안 잡힙니다.
  2. 판정은 LastTaskResult가 아니라 산출물 시각의 간격으로 하세요.
  3. StartWhenAvailable은 지연 복구, WakeToRun은 정시 실행입니다. 목적이 다릅니다.
  4. 폴더 안 작업을 수정할 땐 -TaskPath를 같이 넘기세요.
  5. 반응 속도가 필요한 처리는 짧은 주기 전용 작업으로 분리하세요.

감시 도구를 아무리 붙여도 “실행되지 않은 것”은 안 잡힙니다. 그래서 저는 결과값 대신 산출물이 몇 시간째 안 나왔는지를 재는 쪽으로 바꿨습니다. 그 편이 조용한 정지를 훨씬 잘 잡더군요.

#작업스케줄러#TaskScheduler#StartWhenAvailable#WakeToRun#윈도우자동화#PowerShell