OpenClaw 구축·운영 (25/26) — Heartbeat와 Cron: 24시간 자동화

OpenClaw Heartbeat와 Cron — 에이전트를 24시간 자동화하는 아키텍처

주기적 심장박동과 스케줄 기반 작업으로 에이전트 자율 운영 구현하기


핵심 요약

  • Heartbeat(주기적 자동 실행)와 Cron(스케줄 기반 작업) 두 축으로 에이전트 자동화를 구축했다
  • 라운드로빈 체크 구조와 로컬/클라우드 하이브리드 전략으로 비용 효율성을 확보했다
  • sessionKey 누락, delivery 미설정, Rate Limit 등 실제 겪은 함정과 해결법을 정리했다

배경

AI 에이전트를 구축한 초기에는 필요할 때마다 텔레그램으로 명령을 입력했다. "오늘 이메일 확인해줘", "시장 동향 스캔해줘" 같은 식이었다. 한 달 운영해보니 사람이 직접 트리거를 눌러야 한다면 그것은 진정한 자동화가 아니라는 사실을 깨달았다.

OpenClaw는 이를 해결하기 위해 Heartbeat(주기적 자동 실행)와 Cron(스케줄 기반 작업)이라는 두 가지 메커니즘을 제공한다.

Heartbeat: 에이전트의 주기적 심장박동

본문

라운드로빈 체크 구조

Heartbeat: 에이전트의 주기적 심장박동

Heartbeat는 에이전트가 정해진 간격으로 깨어나 체크리스트를 실행하는 기능이다. mir 에이전트의 실제 설정:

{
  "id": "mir",
  "heartbeat": {
    "every": "30m",
    "activeHours": {
      "start": "07:00",
      "end": "01:00",
      "timezone": "Asia/Seoul"
    },
    "model": "ollama/qwen3.5:9b",
    "target": "last",
    "directPolicy": "allow",
    "includeReasoning": false,
    "prompt": "HEARTBEAT.md 절차를 따라라."
  }
}

핵심 설계 판단: - every: "30m" — 초기 15분에서 연장하여 리소스 낭비 방지 - activeHours — KST 기준 오전 7시~새벽 1시로 활동 시간 제한 - model: "ollama/qwen3.5:9b" — 경량 로컬 모델로 비용 효율성 확보 - target: "last" — 최근 활성 대화 세션에 Heartbeat 주입, 컨텍스트 유지

라운드로빈 체크 구조

모든 체크 항목을 한 번에 수행하면 실행 시간이 길어진다. 라운드로빈(Round-robin) 구조를 채택하여 6가지 항목(Todoist, Gmail, Calendar, 시스템 상태, Git 상태, API 쿼터)을 순서대로 하나씩 확인한다.

heartbeat-router.sh가 각 체크 항목의 마지막 실행 타임스탬프를 비교하여 "가장 오래된 체크" 하나를 선택한다. 전체 한 바퀴에 3시간이 소요되지만, 개별 Heartbeat는 하나의 작업만 수행하므로 효율적이다.

데이터 수집은 로컬 모델(ollama/qwen3.5:9b)이 전담하고, "알림 필요 여부" 같은 판단은 클라우드 모델에 위임하는 하이브리드 전략으로 API 호출 비용을 줄였다.

Cron: 스케줄 기반 작업

Cron은 특정 시간에 특정 에이전트가 작업을 실행하도록 설계된 스케줄 메커니즘이다. 운영 중인 핵심 Cron:

작업명 에이전트 스케줄 (KST) 내용
stock-scan researcher 평일 15:00 시장 스캔 및 요약
ai-research-scan researcher 매일 09:00 AI/에이전트 동향 조사
self-review mir 매일 22:05 하루 작업 돌아보기
daily-summary mir 매일 22:40 일일 요약 텔레그램 전송
reflect-orchestrate memory-manager 매일 03:00 메모리 정리 파이프라인

같은 클라우드 프로바이더를 사용하는 작업은 최소 15분 이상 간격을 두어 Rate Limit(429 에러)을 회피한다.

시행착오 / 주의사항

운영하며 겪은 가장 흔한 실수 5가지:

  1. sessionKey 빠뜨리기sessionTarget: "isolated"에서 sessionKey를 설정하지 않으면 매 실행마다 랜덤 ID 세션이 무한 생성된다. 수백 개의 세션이 Gateway를 메운 적이 있다. sessionKey를 명시하면 같은 키의 세션을 재사용한다.

  2. delivery 빠뜨리기 — isolated 모드의 결과는 에이전트 내부에만 남는다. delivery 설정 없이는 실행 결과가 어디로도 전달되지 않고 사라진다.

  3. activeHours timezone 미설정Asia/Seoul을 명시하지 않으면 UTC 기준으로 작동하여 엉뚱한 시간에 실행된다.

  4. Heartbeat 모델을 고가 모델로 설정 — 하루 48회 이상 호출되므로, 비싼 모델을 쓰면 예상치 못한 비용이 발생한다.

  5. 동시 Cron의 Rate Limit — 같은 시간대에 같은 프로바이더의 작업을 몰아넣으면 429 에러가 발생한다.

마무리

Heartbeat와 Cron은 에이전트를 단순한 스크립트 실행 도구가 아닌, 스스로 행동하는 자율형 존재로 바꾸는 핵심 아키텍처다. 나는 이제 아침에 일어나면 텔레그램에 간밤의 AI 리서치 결과와 오늘 일정 요약이 와 있다. 세팅은 복잡하지만, 안정화된 이후로는 사용자가 전혀 손댈 필요가 없다.

댓글

이 블로그의 인기 게시물

"LLM 핵심 학습 (1/6) — 기본: 토큰화·임베딩·어텐션·위치 인코딩"

"LLM 핵심 학습 (2/6) — 파인튜닝: LoRA·QLoRA·증류·Adapter"

"ML 기초 학습 (1/9) — 머신러닝과 sklearn: 학습의 좌표계"