AI 에이전트 Cron 작업에서 부분 실패를 처리하는 방법

발행: (2026년 3월 1일 오전 02:10 GMT+9)
6 분 소요
원문: Dev.to

Source: Dev.to

anicca

TL;DR

AI‑agent 크론 작업에서 부분 실패를 감지하고 복구하며 추적하는 방법을 배웁니다. 이 접근 방식으로 성공률을 70 % → 95 % 로 향상시켰으며, 핵심 기능은 성공했지만 부수 작업이 실패하는 경우도 처리합니다.

Prerequisites

  • AI‑agent 프레임워크 (OpenClaw 또는 유사)
  • Cron 기반 스케줄 작업
  • 외부 API 의존성 (소셜 포스팅, 메시지 전달)
  • 알림 채널 (Slack, Discord 등)

문제: 숨겨진 부분 실패

일반적인 AI‑에이전트 크론 작업 흐름:

# x-poster-morning example
 Post to X API (200 OK)
 Message delivery fails (Timeout/Rate Limit)
 What's the job status?

전통적인 이진 접근 방식

if curl -X POST "$API_ENDPOINT"; then
  echo "SUCCESS"
  exit 0
else
  echo "FAILED"
  exit 1
fi

이 논리는 “게시 성공 + 전달 실패”를 성공으로 간주하는데, 이는 오해를 불러일으킵니다.

Step 1 – 세분화된 상태 추적

각 하위 작업을 개별적으로 추적하고 전체 상태를 도출합니다.

#!/bin/bash
declare -A RESULTS
OVERALL_SUCCESS=true

# Step 1: Post to X
if post_to_x "${CONTENT}"; then
  RESULTS[post]="✅ SUCCESS"
else
  RESULTS[post]="❌ FAILED"
  OVERALL_SUCCESS=false
fi

# Step 2: Message delivery
if deliver_message "${RESULT_MSG}"; then
  RESULTS[delivery]="✅ SUCCESS"
else
  RESULTS[delivery]="⚠️ FAILED"
  # Not a complete failure since posting succeeded
fi

# Step 3: Overall status determination
if [[ "${RESULTS[post]}" == *"SUCCESS"* ]]; then
  STATUS="PARTIAL_SUCCESS"
  if [[ "${RESULTS[delivery]}" == *"SUCCESS"* ]]; then
    STATUS="FULL_SUCCESS"
  fi
else
  STATUS="FULL_FAILURE"
fi

Step 2 – 단계별 Slack 알림

파생된 상태에 따라 다른 메시지를 전송합니다.

report_to_slack() {
  local status=$1
  case $status in
    "FULL_SUCCESS")
      openclaw message send --channel slack --target 'C091G3PKHL2' \
        --message "✅ x-poster-morning: All operations successful"
      ;;
    "PARTIAL_SUCCESS")
      openclaw message send --channel slack --target 'C091G3PKHL2' \
        --message "⚠️ x-poster-morning: Core success, delivery failed
Core: ${RESULTS[post]}
Delivery: ${RESULTS[delivery]}
Manual review needed"
      ;;
    "FULL_FAILURE")
      openclaw message send --channel slack --target 'C091G3PKHL2' \
        --message "❌ x-poster-morning: Complete failure
${RESULTS[post]}
Immediate action required"
      ;;
  esac
}

단계 3 – 스마트 재시도 로직

실패한 구성 요소만 재시도하고, 지수 백오프를 사용합니다.

retry_failed_delivery() {
  local max_attempts=3
  local attempt=1

  while [ $attempt -le $max_attempts ]; do
    echo "Delivery retry attempt $attempt/$max_attempts"

    if deliver_message "${CACHED_RESULT}"; then
      RESULTS[delivery]="✅ SUCCESS (retry $attempt)"
      return 0
    fi

    sleep $((attempt * 10))   # exponential back‑off
    ((attempt++))
  done

  RESULTS[delivery]="❌ FAILED after $max_attempts retries"
  return 1
}

단계 4 – 상태 지속성

부분 실패 상태를 저장하여 나중에 분석하고 수동 복구할 수 있도록 합니다.

STATE_FILE="/Users/anicca/.openclaw/workspace/cron-state/${JOB_NAME}-$(date +%Y-%m-%d).json"

save_job_state() {
  cat > "$STATE_FILE"  "${METRICS_FILE}.tmp" && mv "${METRICS_FILE}.tmp" "$METRICS_FILE"
}

weekly_report() {
  echo "## Cron Success Rate (Last 7 days)"
  jq -r '
    to_entries |
    map(select(.key >= (now - 7*24*3600 | strftime("%Y-%m-%d")))) |
    map(.value | to_entries | map(.value.status)) |
    flatten |
    group_by(.) |
    map({status: .[0], count: length}) |
    .[]
  ' "$METRICS_FILE"
}

완전 구현

#!/bin/bash
set -euo pipefail

JOB_NAME="x-poster-morning"
declare -A RESULTS
RETRY_COUNT=0
STATE_FILE="/Users/anicca/.openclaw/workspace/cron-state/${JOB_NAME}-$(date +%Y-%m-%d).json"

main() {
  # Execute core logic
  execute_core_logic

  # Determine initial status
  determine_overall_status

  # Retry delivery if partial failure
  if [[ "$STATUS" == "PARTIAL_SUCCESS" ]]; then
    retry_failed_delivery
    determine_overall_status   # Re‑evaluate after retry
  fi

  # Persist state, notify, update metrics
  save_job_state
  report_to_slack "$STATUS"
  update_metrics

  # Exit codes for monitoring tools
  case "$STATUS" in
    "FULL_SUCCESS")   exit 0 ;;
    "PARTIAL_SUCCESS") exit 1 ;;   # Attention needed but not critical
    "FULL_FAILURE")   exit 2 ;;   # Critical
  esac
}

main "$@"

이러한 단계들을 통해 AI 에이전트 크론 작업에서 부분 실패를 신뢰성 있게 감지하고 복구하며 모니터링할 수 있으며, 숨겨진 오류를 실행 가능한 데이터로 전환하고 전반적인 신뢰성을 크게 향상시킬 수 있습니다.

주요 내용

교훈세부 내용
이분법적 사고 피하기SUCCESS/FAIL는 충분하지 않으며, PARTIAL_SUCCESS는 적절한 대응을 가능하게 합니다
세분화된 모니터링각 작업을 개별적으로 추적하여 실패 위치를 정확히 파악합니다
스마트 재시도 전략전체 워크플로가 아니라 실패한 구성 요소만 재시도합니다
상태 지속성JSON 형식은 손쉬운 분석과 수동 복구를 가능하게 합니다
지표 기반 개선정량화된 성공률은 최적화 작업을 가시화합니다

이 접근 방식으로 AI‑에이전트 크론 성공률을 **70 %**에서 **95 %**로 향상시켰습니다. 적절한 부분 실패 처리는 시스템 신뢰성을 높이고 수동 개입 필요성을 줄입니다.

0 조회
Back to Blog

관련 글

더 보기 »

일이 정신 건강 위험이 될 때

markdown !Ravi Mishrahttps://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fu...