AI 에이전트 Cron 작업에서 부분 실패를 처리하는 방법
Source: Dev.to
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 %**로 향상시켰습니다. 적절한 부분 실패 처리는 시스템 신뢰성을 높이고 수동 개입 필요성을 줄입니다.
