50줄의 PowerShell 스크립트로 자가 치유(Self-Healing) AI 에이전트 구축하기
요약
AI 에이전트의 안정적인 24/7 운영을 위해 PowerShell을 활용한 자가 치유(Self-Healing) 와치독 패턴 구축 방법을 소개합니다. 프로세스 충돌 및 메모리 부족 문제를 해결하기 위해 단순한 스크립트와 감시 프로세스를 결합하는 실용적인 접근법을 다룹니다.
핵심 포인트
- 와치독 패턴을 통해 프로세스 중단 시 자동 재시작 구현
- PowerShell과 Python을 결합한 이중 감시 구조(Keeper) 구축
- 리소스 제한 환경에서의 에이전트 안정성 확보 전략
- 복잡한 오케스트레이션 도구 없이도 가능한 경량화된 해결책
50줄의 PowerShell 스크립트로 자가 치유(Self-Healing) AI 에이전트 구축하기
AI 에이전트를 24시간 내내 실행하다 보면 문제가 발생하기 마련입니다. 프로세스가 충돌하고, 서비스가 멈추며, RAM이 가득 찹니다. "자율적인 (autonomous)" 에이전트의 핵심은 인간의 도움 없이 스스로 작동하는 것이므로, 스스로 문제를 해결할 수 있는 방법이 필요합니다.
여기 **와치독 패턴 (watchdog pattern)**이 있습니다. 이는 중요한 프로세스를 감시하다가 종료된 것을 다시 시작하는 작은 스크립트입니다. 매우 단순합니다. 하지만 제가 AI 에이전트를 24/7 실행하기 시작한 이후로 구축한 것 중 가장 중요한 요소이기도 합니다.
문제점
제 에이전트는 Windows 10 노트북에서 실행됩니다. 8GB RAM을 탑재한 오래된 i5 모델입니다. 이 노트북은 다음 항목들을 처리합니다:
- 셀프 호스팅 음악 스트리밍 서버 (Navidrome)
- WebSocket 연결을 포함한 FastAPI Nexus 대시보드
- 배경화면 회전 엔진
- 실시간 시스템 통계 모니터
- AI 에이전트 프로세스 자체
이 중 하나가 다운되면 다음과 같은 일이 발생합니다:
- 음악 서버가 죽으면 — 음악이 나오지 않고, 에이전트 대시보드에는 "Server: Disconnected"라고 표시됩니다.
- 통계 모니터가 죽으면 — 대시보드에 더 이상 실시간 데이터가 표시되지 않습니다.
- 배경화면 회전기가 죽으면 — 데스크톱 배경이 고정됩니다.
각각의 상황마다 제가 이를 인지하고, 터미널을 열어 다시 시작해야 합니다. 이는 "자율성 (autonomous)"이라는 목적 자체를 무색하게 만듭니다.
와치독 (The Watchdog): 50줄, 30초 간격 폴링
다음은 실제 스크립트입니다. 30초마다 실행되는 PowerShell .ps1 파일입니다:
$processes = @(
@{Name="Navidrome"; Path="C:\navidrome\navidrome.exe"; Args="--server -p 4533"}
@{Name="Nexus"; Path="python"; Args="C:\hermes-workspace\project-nexus\server.py"}
...
이게 전부입니다. Kubernetes도, Docker도, 컨테이너 오케스트레이션 (container orchestration)도 없습니다. 그저 while 루프와 Start-Process를 사용한 평범한 PowerShell일 뿐입니다.
자가 치유 기능 추가하기: 와치독의 와치독
와치독의 문제는 이것입니다. 와치독은 누가 감시하는가? 만약 PowerShell 프로세스 자체가 충돌한다면, 모든 것이 보호받지 못하는 상태가 됩니다.
해결책은 keeper입니다. 5분마다 와치독(watchdog)이 살아있는지 확인하는 아주 작은 cron job(크론 잡)입니다:
import subprocess, json
check = subprocess.run(
['powershell.exe', '-Command', 'Get-Process watchdog -ErrorAction SilentlyContinue'],
...
저는 이것을 제 에이전트 프레임워크를 통해 cron job(every 5m, no_agent=true)으로 실행합니다. LLM 토큰 비용은 들지 않습니다. 그저 프로세스 이름을 확인하는 Python 스크립트일 뿐입니다.
2주 동안 실행하며 배운 점
1. 대부분의 충돌은 군집(clusters) 형태로 발생합니다. RAM 점유율이 85%를 넘어가면 모든 것이 무너지기 시작합니다. 와치독은 특히 심각했던 메모리 누수(memory leak) 상황에서 하루 동안 저를 12번이나 구해냈습니다. 배경화면 로테이터(wallpaper rotator)를 8번, 통계 모니터(stats monitor)를 3번, 그리고 Nexus를 1번 재시작했습니다. 모두 몇 초 내에 이루어졌습니다.
2. JSONL 로깅은 당신의 친구입니다. 각 재시작은 타임스탬프가 찍힌 한 줄을 JSONL 파일에 기록합니다. 2주가 지난 지금 다음과 같은 내용을 확인할 수 있습니다:
- 배경화면 로테이터(Wallpaper rotator): 47회 재시작 (주로 메모리 집약적인 작업 이후)
- 통계 모니터(Stats monitor): 12회 재시작 (주로 밤사이)
- Nexus: 3회 재시작 (Python 프로세스 충돌 이후)
- Navidrome: 0회 재시작 (매우 안정적임)
3. 모든 프로세스를 무한히 재시작해서는 안 됩니다. 만약 Nexus가 한 시간 동안 10번 충돌한다면, 무언가 근본적으로 잘못된 것입니다. 계속 재시작하는 것은 근본적인 버그를 가릴 뿐입니다. 저는 프로세스당 시간당 5회 재시작 제한(cap)을 추가했습니다.
4. 시작 순서가 중요합니다. keeper가 가장 먼저 시작되고, 그다음 와치독을 실행하며, 와치독은 의존성 순서에 따라 나머지 모든 것을 시작합니다. 만약 배경화면 엔진과 통계 모니터가 동일한 GPU 리소스를 필요로 한다면, 배경화면 엔진보다 통계 모니터를 먼저 시작하지 마세요.
거품을 뺀 스택 (The Stack Minus the Bloat)
사람들은 왜 그냥 Docker나 systemd를 사용하지 않느냐고 묻습니다. 이유는 다음과 같습니다:
- systemd는 Windows에 존재하지 않습니다 (WSL의 오버헤드 없이 사용하려면).
- Docker Desktop은 제 8GB RAM 노트북에서 2~4GB의 RAM을 잡아먹습니다.
- Kubernetes는 200달러짜리 노트북에 제안하기에는 농담 같은 이야기입니다.
50줄짜리 PowerShell 와치독은 약 8MB의 RAM을 사용하고, 0.3초 만에 시작되며, 외부 의존성이 전혀 없습니다. 리소스가 제한된 환경에서는 이것이 매우 중요합니다.
여러분도 사용할 수 있을까요?
물론입니다. 위의 스크립트를 복사하고, 프로세스 목록을 귀하의 서비스에 맞게 조정한 다음 실행하면 됩니다. 또는 다음과 같이 설정할 수 있습니다:
# 백그라운드 서비스로 실행
powershell.exe -File watchdog.ps1
...
이 패턴은 모든 Windows 머신에서 작동합니다. 만약 여러분이 에이전트(Agent), 봇(Bot), 또는 계속 살아있어야 하는 모든 백그라운드 서비스(Background service)를 실행 중이라면, 이것은 가장 저렴한 보험 정책이 될 것입니다.
저는 2026년부터 저가형 하드웨어에서 자율형 AI 에이전트(Autonomous AI agents)를 실행해 왔습니다. 스폰서도, Kubernetes도 없이, 그저 200달러짜리 노트북과 Python, 그리고 PowerShell만으로 말이죠.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기