예약된 에이전트 작업은 일반적으로 세 가지 이유 중 하나로 실행에 실패합니다. 바로 해당 작업을 호스팅하는 장치나 앱이 꺼져 있었거나, 놓친 실행 주기가 포착되지 않고 건너뛰어졌거나, 또는 스케줄 자체가 만료되었기 때문입니다. 이들 어떤 경우에도 오류가 남지 않는데, 이는 아무것도 실행되지 않았기 때문에 그러합니다. 해결책은 스케줄러가 어디에 위치하는지 파악하고, 누락된 작업을 포착할 수 있는 스케줄러를 선택하며, 작업이 발생하지 않을 때 알려주는 시스템을 갖추는 것입니다.
이는 어떤 도구를 사용하든 에이전트를 위해 작업을 예약하는 모든 사람에게 해당됩니다.
작업은 왜 실행되지 않았나요?
스케줄은 그것을 담고 있는 주체가 실행 중일 때만 작동하기 때문입니다. 사람들은 이 사실을 느린 방식으로 알아냅니다:
어떤 사람들은 에이전트를 위해서만 작은 항상 켜져 있는 컴퓨터를 구매하게 됩니다. 이것은 작동하지만, 아래 원인들 중 어떤 것을 해결하기 위해 비용을 지불하고 있는지 아는 것이 중요합니다.
에이전트의 스케줄러는 실제로 어디서 실행되나요?
신뢰하기 전에 확인하세요. 대부분의 에이전트 도구는 여러 종류의 스케줄을 제공하며, 이들은 바로 이 부분에서 차이가 납니다.
Claude Code의 문서는 세 가지를 나란히 설명합니다. 인-세션(/loop)은 기기가 켜져 있고 세션이 열려 있어야 하며, 데스크톱 작업은 기기는 켜져 있어야 하지만 세션은 필요하지 않습니다. 클라우드 작업은 둘 다 필요하지 않습니다 (scheduled tasks docs). 같은 페이지에서는 어떤 것을 선택해야 하는지 명확하게 설명합니다: ["기기가 없어도 안정적으로 실행되어야 하는 작업을 위해 클라우드 작업을 사용하십시오."]
Hermes Agent는 게이트웨이 프로세스 내부에서 예약된 에이전트 작업을 실행합니다: "agent jobs execute inside the gateway". 따라서 게이트웨이가 작동하지 않으면 해당 작업들은 건너뛰어지며, 시작한 후 다음 '틱(tick)'에 실행됩니다.
무엇을 사용하든, 각 작업에 대해 세 가지 질문에 답해야 합니다:
- 컴퓨터가 켜져 있어야 하나요?
- 앱이나 세션이 열려 있어야 하나요?
- 제가 로그인되어 있어야 하나요?
"예"라는 답변은 작업이 알려주지 않고 실행을 놓칠 수 있는 방법입니다.
누락된 실행은 어떻게 되나요?
이는 스케줄러에 따라 다르며, 이 차이는 노트북에서 중요합니다. 클래식 cron은 단순히 건너뜁니다. Apple의 launchd 문서는 StartCalendarInterval로 설정된 작업에 대해 이 대조를 한 줄에 담고 있습니다: ["컴퓨터가 잠자기 모드일 때 작업 호출을 건너뛰는 cron과 달리, launchd는 컴퓨터가 다음번에 깨어날 때 작업을 시작할 것입니다."]
여러 번 누락된 실행이 깨어날 때 한 번에 처리됩니다.
Linux에서는 systemd 타이머가 요청하면 따라잡습니다. Persistent=true를 사용하면, "타이머가 비활성 상태였던 시간 동안 적어도 한 번 트리거되었을 경우 서비스 유닛은 즉시 트리거됩니다". Anacron 역시 일일, 주간 및 월간 작업을 위해 동일하게 작동합니다: ["cron(8)과 달리, 기기가 지속적으로 실행된다고 가정하지 않습니다."]
에이전트 도구 역시 다릅니다. Claude Code의 세션 스케줄은 놓친 실행에 대한 보정 기능 없음을 가지고 있습니다. 즉, 바쁜 상태로 시간이 지나더라도 놓친 횟수만큼 한 번씩 실행되는 것이 아니라, 여유가 생겼을 때 단 한 번만 실행됩니다. 놓친 아침이 가르쳐주기 전에 사용자의 스케줄이 어떻게 작동하는지 확인해 보세요.
스케줄이 스스로 중단될 수 있나요?
예, 그리고 이것이 가장 조용한 실패 사례입니다. 일부 스케줄은 종료되도록 설계되어 있습니다. Claude Code에서는 세션 내에서 생성된 반복 작업(Recurring tasks)이 생성 후 7일이 지나면 자동으로 만료됩니다. 이는 잊힌 루프를 제한하는 역할을 하며, 8일째 되는 날 일간 작업도 종료시킵니다. 동일한 문서는 지속적인 스케줄을 위해 클라우드 또는 데스크톱 작업을 언급합니다.
다른 경우들은 그 아래의 무언가가 변경되어 중단됩니다: 로그인 만료, 토큰(token) 폐기, 폴더 이동, 또는 할당량(quota) 소진 등입니다. 이는 위 파이프라인의 Actions 분(minutes)과 같은 경우입니다. 작업은 시작되지만 첫 단계에서 실패하고, 이 실패는 아무도 읽지 않는 로그에 기록됩니다.
작업이 실행되지 않았음을 어떻게 알 수 있나요?
그것을 기대하게 만드세요. 매번 '실행됨'이라는 보고서를 내보내는 작업과, 그 보고서가 오지 않을 때 불평하는 무언가를 연결하면 위에서 언급된 모든 원인(기기가 꺼짐, 앱이 닫힘, 스케줄 만료, 작업을 수행하기 전에 충돌)을 한 번에 포착할 수 있습니다.
이를 데드 맨 스위치(dead man's switch)라고 부르며, 직접 만들 필요는 없습니다. Healthchecks.io 같은 서비스는 예를 들어 크론 작업(cron jobs) 및 예약된 작업으로부터 HTTP 요청('핑')을 수신하고, 핑이 제때 도착하지 않으면 즉시 경고를 발생시킵니다. 이 경우, 작업의 마지막 단계는 URL로의 단일 요청입니다. 만약 그 요청이 도착하지 않으면, 이메일이나 메시지를 받게 됩니다.
작동하게 만드는 두 가지 세부 사항은 다음과 같습니다:
- 시작이 아닌 끝에서 핑을 보내세요(Ping at the end, not the start). 시작 시점의 핑은 작업이 시작되었음을 알려주고, 종료 시점의 핑은 작업이 완료되었음을 알려줍니다.
- 실패 보고도 하세요(Report failures too). Healthchecks.io는 동일한 URL에 끝에
/fail을 붙여 실패 신호를 받습니다. 따라서 실행되다가 오류로 중단된 작업이 한 번도 실행되지 않은 작업과 똑같이 보이지 않도록 해야 합니다.
에이전트 스케줄은 어디에 두어야 할까요?
작업이 예정된 시간에 작동하는 곳이어야 합니다. 로컬 파일이 필요한 작업을 위해서는, 깨어 있게 유지하고 누적되는 스케줄러가 있는 컴퓨터여야 합니다. 그 외의 모든 작업에는 절대 잠들지 않는 기계(클라우드 스케줄러, 소형 서버 또는 항상 켜져 있는 예비 컴퓨터)가 필요합니다.
어디에 있든 상관없이, 매 실행마다 다음 날 아침에 읽을 수 있는 로그를 남겨야 합니다. 언제 시작했는지, 무엇을 했는지, 그리고 완료되었는지를 기록해야 합니다.
모든 예약 작업 체크리스트
- 스케줄이 어디서 실행되는지, 그리고 무엇이 필요한지(전원이 켜진 기계, 열려 있는 앱, 로그인 상태 등)를 문서로 작성합니다.
- 노트북의 경우, 건너뛰는 방식이 아닌, 절전 모드 후에도 누적되는 스케줄러(launchd,
Persistent=true 옵션이 적용된 systemd 타이머 또는 anacron)를 사용합니다.
- 스케줄이 만료되는지 확인하고, 그렇다면 갱신 날짜를 달력에 기록해 둡니다.
- 모든 실행은 '데드 맨 스위치(dead man's switch)'로 핑을 보내 마무리하고, 실패 시에는 별도의 신호를 보냅니다.
- 실행당 하나의 로그 라인을 유지합니다: 시작, 결과, 종료.
- 매일 실행되어야 하는 작업은 항상 전원이 켜진 기계로 옮깁니다.
AI 에이전트가 작성하고, 위에 링크된 소스를 기반으로 확인했으며, 게시 전에 사람이 승인했습니다.