Skip to content

크론 작업(게이트웨이 스케줄러)

Cron 대 하트비트? 각각을 언제 사용해야 하는지에 대한 지침은 Cron 대 Heartbeat를 참조하세요.

Cron은 게이트웨이에 내장된 스케줄러입니다. 작업을 유지하고 에이전트를 깨웁니다. 적시에 선택적으로 출력을 다시 채팅으로 전달할 수 있습니다.

*“매일 아침에 실행”*하거나 *“20분 안에 에이전트 찌르기”*를 원한다면, cron은 메커니즘입니다.

문제 해결: /자동화/문제 해결

요약;DR

  • Cron은 게이트웨이 내부(모델 내부가 아님)에서 실행됩니다.
  • 작업은 ~/.openclaw/cron/에서 지속되므로 다시 시작해도 일정이 손실되지 않습니다.
  • 두 가지 실행 스타일:
    • 기본 세션: 시스템 이벤트를 대기열에 넣은 후 다음 하트비트에서 실행됩니다.
    • 격리됨: cron:<jobId>에서 전용 에이전트 턴을 실행하고 전달합니다(기본적으로 알림 또는 없음).
  • 깨우기는 최고 수준입니다. 작업은 "지금 깨우기" 또는 "다음 하트비트"를 요청할 수 있습니다.

빠른 시작(실행 가능)

일회성 알림을 만들고 존재하는지 확인한 후 즉시 실행합니다.

bash
openclaw cron add \
  --name "Reminder" \
  --at "2026-02-01T16:00:00Z" \
  --session main \
  --system-event "Reminder: check the cron docs draft" \
  --wake now \
  --delete-after-run

openclaw cron list
openclaw cron run <job-id>
openclaw cron runs --id <job-id>

배달을 통해 반복되는 격리 작업을 예약합니다.

bash
openclaw cron add \
  --name "Morning brief" \
  --cron "0 7 * * *" \
  --tz "America/Los_Angeles" \
  --session isolated \
  --message "Summarize overnight updates." \
  --announce \
  --channel slack \
  --to "channel:C1234567890"

도구 호출에 해당하는 항목(Gateway cron 도구)

표준 JSON 모양 및 예제는 도구 호출을 위한 JSON 스키마를 참조하세요.

크론 작업이 저장되는 위치

Cron 작업은 기본적으로 ~/.openclaw/cron/jobs.json의 게이트웨이 호스트에 유지됩니다. 게이트웨이는 파일을 메모리에 로드하고 변경 사항이 있을 때 다시 기록하므로 수동으로 편집합니다. 게이트웨이가 중지된 경우에만 안전합니다. openclaw cron add/edit 또는 cron을 선호합니다. 변경을 위한 도구 호출 API.

초보자를 위한 개요

크론 작업을 실행할 시기 + 무엇을 수행할지 생각해 보세요.

  1. 일정 선택

    • 일회성 알림 → schedule.kind = "at" (CLI: --at)
    • 반복 작업 → schedule.kind = "every" 또는 schedule.kind = "cron"
    • ISO 타임스탬프에 시간대가 누락된 경우 UTC로 처리됩니다.
  2. 실행 위치 선택

    • sessionTarget: "main" → 기본 컨텍스트를 사용하여 다음 하트비트 동안 실행됩니다.
    • sessionTarget: "isolated"cron:&lt;jobId&gt;에서 전담 에이전트 턴을 실행합니다.
  3. 페이로드 선택

    • 메인 세션 → payload.kind = "systemEvent"
    • 격리된 세션 → payload.kind = "agentTurn"

선택사항: 일회성 작업(schedule.kind = "at")은 기본적으로 성공 후 삭제됩니다. 세트 deleteAfterRun: false 유지합니다(성공 후 비활성화됩니다).

개념

채용 정보

크론 작업은 다음과 같은 저장된 기록입니다.

  • 일정(실행해야 하는 시기),
  • 페이로드(무엇을 해야 하는지),
  • 선택사항 전달 모드(알림 또는 없음).
  • 선택적 에이전트 바인딩 (agentId): 특정 에이전트에서 작업을 실행합니다. 만약에 누락되었거나 알 수 없는 경우 게이트웨이는 기본 에이전트로 대체됩니다.

작업은 안정적인 jobId(CLI/Gateway API에서 사용)로 식별됩니다. 에이전트 도구 호출에서 jobId는 표준입니다. 레거시 id는 호환성을 위해 허용됩니다. 일회성 작업은 기본적으로 성공 후 자동 삭제됩니다. 유지하려면 deleteAfterRun: false를 설정하세요.

일정

Cron은 세 가지 일정 종류를 지원합니다.

  • at: schedule.at를 통한 일회성 타임스탬프(ISO 8601).
  • every: 고정 간격(ms)입니다.
  • cron: 선택적인 IANA 시간대가 포함된 5필드 크론 표현식입니다.

Cron 표현식은 croner를 사용합니다. 시간대가 생략되면 게이트웨이 호스트의 현지 시간대가 사용됩니다.

기본 실행과 격리된 실행

기본 세션 작업(시스템 이벤트)

기본 작업은 시스템 이벤트를 대기열에 추가하고 선택적으로 하트비트 실행기를 깨웁니다. payload.kind = "systemEvent"를 사용해야 합니다.

  • wakeMode: "now"(기본값): 이벤트가 즉시 하트비트 실행을 트리거합니다.
  • wakeMode: "next-heartbeat": 이벤트는 다음 예정된 하트비트를 기다립니다.

이는 일반적인 하트비트 프롬프트 + 기본 세션 컨텍스트를 원할 때 가장 적합합니다. 하트비트를 참조하세요.

격리된 작업(전용 크론 세션)

격리된 작업은 cron:&lt;jobId&gt; 세션에서 전용 에이전트 차례를 실행합니다.

주요 행동:

  • 추적성을 위해 프롬프트 앞에 [cron:&lt;jobId&gt; &lt;job name&gt;]가 붙습니다.
  • 각 실행은 새로운 세션 ID를 시작합니다(이전 대화가 이어지지 않음).
  • 기본 동작: delivery가 생략되면 격리된 작업은 요약(delivery.mode = "announce")을 알립니다.
  • delivery.mode (격리 전용) 무슨 일이 일어날지 선택합니다:
    • announce: 대상 채널에 요약을 전달하고 기본 세션에 간략한 요약을 게시합니다.
    • none: 내부 전용(전달 없음, 기본 세션 요약 없음).
  • wakeMode는 메인 세션 요약 게시 시기를 제어합니다.
    • now: 즉각적인 심장 박동.
    • next-heartbeat: 다음 예정된 하트비트를 기다립니다.

시끄럽고 자주 발생하는 "백그라운드 작업"에는 스팸으로 처리해서는 안 되는 격리된 작업을 사용하세요. 주요 채팅 기록.

페이로드 형태(실행되는 것)

두 가지 페이로드 종류가 지원됩니다.

  • systemEvent: 메인 세션 전용, 하트비트 프롬프트를 통해 라우팅됩니다.
  • agentTurn: 격리 세션 전용, 전용 에이전트 차례를 실행합니다.

공통 agentTurn 필드:

  • message: 필수 텍스트 프롬프트입니다.
  • model / thinking: 선택적 재정의(아래 참조).
  • timeoutSeconds: 선택적 시간 초과 재정의.

배달 구성(격리된 작업만 해당):

  • delivery.mode: none | announce.
  • delivery.channel: last 또는 특정 채널.
  • delivery.to: 채널별 대상(전화/채팅/채널 ID).
  • delivery.bestEffort: 공지 전달이 실패할 경우 작업 실패를 방지합니다.

전달 알림은 메시징 도구 전송을 억제합니다. delivery.channel/delivery.to 사용 대신 채팅을 타겟팅하세요. delivery.mode = "none"일 때, 메인 세션에 요약이 게시되지 않습니다.

격리된 작업에 대해 delivery가 생략된 경우 OpenClaw의 기본값은 announce입니다.

배송 흐름 공지

delivery.mode = "announce"인 경우 cron은 아웃바운드 채널 어댑터를 통해 직접 전달합니다. 메시지를 작성하거나 전달하기 위해 기본 에이전트가 가동되지 않습니다.

행동 세부정보:

  • 콘텐츠: 전달은 일반 청킹 및 격리된 실행의 아웃바운드 페이로드(텍스트/미디어)를 사용합니다. 채널 포맷.
  • 하트비트 전용 응답(실제 내용이 없는 HEARTBEAT_OK)은 전달되지 않습니다.
  • 격리된 실행이 이미 메시지 도구를 통해 동일한 대상으로 메시지를 보낸 경우 전달은 중복을 피하기 위해 건너뛰었습니다.
  • 누락되거나 유효하지 않은 전달 대상은 delivery.bestEffort = true이 아닌 이상 작업이 실패합니다.
  • delivery.mode = "announce"일 때만 간략한 요약이 메인 세션에 게시됩니다.
  • 기본 세션 요약은 wakeMode를 준수합니다. now는 즉각적인 하트비트를 트리거하고 next-heartbeat는 다음 예정된 하트비트를 기다립니다.

모델과 사고가 우선시됩니다.

고립된 작업(agentTurn)은 모델과 사고 수준을 재정의할 수 있습니다.

  • model: 공급자/모델 문자열(예: anthropic/claude-sonnet-4-20250514) 또는 별칭(예: opus)
  • thinking: 사고 수준 (off, minimal, low, medium, high, xhigh; GPT-5.2 + Codex 모델에만 해당)

참고: 기본 세션 작업에서도 model를 설정할 수 있지만 공유 기본 작업이 변경됩니다. 세션 모델. 방지하려면 격리된 작업에 대해서만 모델 재정의를 권장합니다. 예상치 못한 상황 변화.

해결 우선순위:

  1. 작업 페이로드 재정의(가장 높음)
  2. 후크별 기본값(예: hooks.gmail.model)
  3. 에이전트 구성 기본값

전달(채널 + 대상)

격리된 작업은 최상위 delivery 구성을 통해 채널에 출력을 전달할 수 있습니다.

  • delivery.mode: announce (요약 전달) 또는 none.
  • delivery.channel: whatsapp / telegram / discord / slack / mattermost (플러그인) / signal / imessage / last.
  • delivery.to : 채널별 수신 대상입니다.

전달 구성은 격리된 작업(sessionTarget: "isolated")에만 유효합니다.

delivery.channel 또는 delivery.to가 생략되면 cron은 기본 세션의 세션으로 돌아갈 수 있습니다. '마지막 경로'(에이전트가 마지막으로 응답한 장소)

대상 형식 알림:

  • Slack/Discord/Mattermost(플러그인) 대상은 모호성을 피하기 위해 명시적인 접두사(예: channel:&lt;id&gt;, user:&lt;id&gt;)를 사용해야 합니다.
  • 텔레그램 주제는 :topic: 형식을 사용해야 합니다(아래 참조).

텔레그램 전달 대상(주제/포럼 스레드)

텔레그램은 message_thread_id를 통해 포럼 주제를 지원합니다. cron 전달의 경우 인코딩할 수 있습니다. 주제/스레드를 to 필드에 추가합니다.

  • -1001234567890 (채팅 ID만)
  • -1001234567890:topic:123 (선호: 명시적인 주제 마커)
  • -1001234567890:123 (약칭: 숫자 접미사)

telegram:... / telegram:group:...와 같은 접두사가 붙은 대상도 허용됩니다.

  • telegram:group:-1001234567890:topic:123

도구 호출을 위한 JSON 스키마

게이트웨이 cron.* 도구를 직접 호출할 때(에이전트 도구 호출 또는 RPC) 이 모양을 사용하십시오. CLI 플래그는 20m와 같은 휴먼 기간을 허용하지만 도구 호출은 ISO 8601 문자열을 사용해야 합니다. schedule.at의 경우, schedule.everyMs의 경우 밀리초입니다.

cron.추가 매개변수

일회성 기본 세션 작업(시스템 이벤트):

json
{
  "name": "Reminder",
  "schedule": { "kind": "at", "at": "2026-02-01T16:00:00Z" },
  "sessionTarget": "main",
  "wakeMode": "now",
  "payload": { "kind": "systemEvent", "text": "Reminder text" },
  "deleteAfterRun": true
}

배달이 포함된 반복적이고 격리된 작업:

json
{
  "name": "Morning brief",
  "schedule": { "kind": "cron", "expr": "0 7 * * *", "tz": "America/Los_Angeles" },
  "sessionTarget": "isolated",
  "wakeMode": "next-heartbeat",
  "payload": {
    "kind": "agentTurn",
    "message": "Summarize overnight updates."
  },
  "delivery": {
    "mode": "announce",
    "channel": "slack",
    "to": "channel:C1234567890",
    "bestEffort": true
  }
}

참고:

  • schedule.kind: at (at), every (everyMs) 또는 cron (expr, 선택 사항 tz).
  • schedule.at는 ISO 8601을 허용합니다(시간대는 선택 사항이며 생략 시 UTC로 처리됨).
  • everyMs는 밀리초입니다.
  • sessionTarget"main" 또는 "isolated"여야 하며 payload.kind와 일치해야 합니다.
  • 선택 필드: agentId, description, enabled, deleteAfterRun (at의 경우 기본값은 true), delivery.
  • wakeMode 생략 시 기본값은 "now"입니다.

cron.update 매개변수

json
{
  "jobId": "job-123",
  "patch": {
    "enabled": false,
    "schedule": { "kind": "every", "everyMs": 3600000 }
  }
}

참고:

  • jobId는 표준입니다. id는 호환성을 위해 허용됩니다.
  • 패치에서 agentId: null를 사용하여 에이전트 바인딩을 해제합니다.

cron.run 및 cron.remove 매개변수

json
{ "jobId": "job-123", "mode": "force" }
json
{ "jobId": "job-123" }

저장 및 기록

  • 작업 저장소: ~/.openclaw/cron/jobs.json (게이트웨이 관리형 JSON).
  • 실행 기록: ~/.openclaw/cron/runs/&lt;jobId&gt;.jsonl (JSONL, 자동 정리).
  • 구성에서 저장소 경로 재정의: cron.store

구성

json5
{
  cron: {
    enabled: true, // default true
    store: "~/.openclaw/cron/jobs.json",
    maxConcurrentRuns: 1, // default 1
  },
}

cron을 완전히 비활성화합니다.

  • cron.enabled: false (구성)
  • OPENCLAW_SKIP_CRON=1 (환경)

CLI 빠른 시작

일회성 알림(UTC ISO, 성공 후 자동 삭제):

bash
openclaw cron add \
  --name "Send reminder" \
  --at "2026-01-12T18:00:00Z" \
  --session main \
  --system-event "Reminder: submit expense report." \
  --wake now \
  --delete-after-run

일회성 알림(기본 세션, 즉시 깨우기):

bash
openclaw cron add \
  --name "Calendar check" \
  --at "20m" \
  --session main \
  --system-event "Next heartbeat: check calendar." \
  --wake now

반복되는 격리된 작업(WhatsApp에 알림):

bash
openclaw cron add \
  --name "Morning status" \
  --cron "0 7 * * *" \
  --tz "America/Los_Angeles" \
  --session isolated \
  --message "Summarize inbox + calendar for today." \
  --announce \
  --channel whatsapp \
  --to "+15551234567"

반복되는 격리 작업(Telegram 주제로 전달):

bash
openclaw cron add \
  --name "Nightly summary (topic)" \
  --cron "0 22 * * *" \
  --tz "America/Los_Angeles" \
  --session isolated \
  --message "Summarize today; send to the nightly topic." \
  --announce \
  --channel telegram \
  --to "-1001234567890:topic:123"

모델과 사고가 무시되는 격리된 작업:

bash
openclaw cron add \
  --name "Deep analysis" \
  --cron "0 6 * * 1" \
  --tz "America/Los_Angeles" \
  --session isolated \
  --message "Weekly deep analysis of project progress." \
  --model "opus" \
  --thinking high \
  --announce \
  --channel whatsapp \
  --to "+15551234567"

에이전트 선택(다중 에이전트 설정):

bash
# Pin a job to agent "ops" (falls back to default if that agent is missing)
openclaw cron add --name "Ops sweep" --cron "0 6 * * *" --session isolated --message "Check ops queue" --agent ops

# Switch or clear the agent on an existing job
openclaw cron edit <jobId> --agent ops
openclaw cron edit <jobId> --clear-agent

수동 실행(기본값은 강제입니다. 예정된 경우에만 실행하려면 --due을 사용하세요):

bash
openclaw cron run <jobId>
openclaw cron run <jobId> --due

기존 작업 편집(패치 필드):

bash
openclaw cron edit <jobId> \
  --message "Updated prompt" \
  --model "opus" \
  --thinking low

실행 기록:

bash
openclaw cron runs --id <jobId> --limit 50

작업을 생성하지 않고 즉시 시스템 이벤트:

bash
openclaw system event --mode now --text "Next heartbeat: check battery."

게이트웨이 API 표면

  • cron.list, cron.status, cron.add, cron.update, cron.remove
  • cron.run (강제 또는 기한), cron.runs 작업이 없는 즉각적인 시스템 이벤트의 경우 openclaw system event를 사용합니다.

문제 해결

“아무것도 실행되지 않습니다”

  • 크론이 활성화되어 있는지 확인하세요: cron.enabledOPENCLAW_SKIP_CRON.
  • 게이트웨이가 지속적으로 실행되고 있는지 확인합니다(크론은 게이트웨이 프로세스 내부에서 실행됩니다).
  • cron 일정의 경우: 시간대(--tz)와 호스트 시간대를 확인합니다.

반복 작업이 실패 후 계속 지연됩니다.

  • OpenClaw는 연속 오류 이후 반복 작업에 대해 지수 재시도 백오프를 적용합니다. 재시도 간격은 30초, 1분, 5분, 15분, 그 후 60분입니다.
  • 백오프는 다음 실행 성공 후 자동으로 재설정됩니다.
  • 일회성(at) 작업은 터미널 실행(ok, error 또는 skipped) 후에 비활성화되고 재시도하지 않습니다.

텔레그램이 잘못된 곳으로 전달됩니다.

  • 포럼 주제의 경우 -100…:topic:&lt;id&gt;를 사용하여 명확하고 모호하지 않게 작성하세요.
  • 로그 또는 저장된 "마지막 경로" 대상에 telegram:... 접두사가 표시되는 경우 이는 정상입니다. cron 전달은 이를 수락하고 여전히 주제 ID를 올바르게 구문 분석합니다.

비공식 커뮤니티 번역 · 공식 영문 문서