프로모

2026년 원격 Mac 정기 Agent: launchd 오케스트레이션, MCP 트리거, 임대 기간 검증

블로그 Agent 워크플로
2026-05-24 약 8 분

원격 Mac M4에서 7×24 정기 Agent를 돌릴 때, 로컬 Mac의 절전·네트워크 단절·Seatbelt 제한이 모델 선택보다 먼저 장애가 되는 경우가 많습니다. 본문은 launchdMCP 트리거를 중심으로 Claude Code / Codex CLI 재현 템플릿을 제시하고, 일 임대 PoC로 검証한 뒤 월 임대 상주 Runner를 확정하는 절차를 정리합니다. worktree 병렬 기사·OpenClaw 게이트웨이 기사와는 의도적으로 역할을 나눕니다.

핵심 요약

  1. 정기 Agent에는 「머신이 잠들지 않음 + 프로세스 재시작 가능 + 로그 감사 가능」이 필요——로컬 Mac은 어렵고 원격 Mac M4가 적합합니다.
  2. launchd는 macOS 네이티브 오케스트레이션: StartCalendarInterval로 cron 대체, KeepAlive로 상주, ThrottleInterval로 크래시 루프 방지.
  3. MCP 트리거는 Curated tools + n8n Webhook 게이트웨이를 권장. MCP 포트 전체를 인터넷에 노출하지 마세요.
  4. 병렬 코딩 Agent는worktree 병렬 기사, 디스크 관리는Runner 디스크/inode 계획을 참고.
  5. 권장 경로: 일 임대 PoC로 launchd + 첫 MCP 작업 통과 → 주 임대로 스프린트 고정 → 지표 안정 후 월 임대 상주.
  6. 메시지형 OpenClaw Gateway와 배치형 CLI 정기 Agent는 역할이 다르며, 본문에서는 18789 배포 골격을 반복하지 않습니다.
원격 Mac M4 정기 Agent——launchd 오케스트레이션과 MCP 자동화 워크스페이스
정기 Agent의 가치는 「재현 가능한 무인 운영」에 있으며, 로컬 Mac을 닫은 뒤 작업이 조용히 실패하는 상태를 피하는 것입니다.

1. 2026년, 정기 Agent를 원격 Mac에 두는 이유

2026년 Cursor Automations, n8n MCP 오케스트레이션, Codex CLI remote-control 등으로 「일정 간격으로 Agent 한 바퀴」 워크로드가 데모에서 과금 대상 workload로 이동 중입니다. 그러나 실행면은 여전히 macOS입니다. launchd는 로컬 프로세스만 스케줄할 수 있고, Seatbelt와 Keychain이 선언되지 않은 도구 접근을 차단합니다. 로컬 Mac은 절전, Wi‑Fi 전환, OS 업데이트 재부팅으로 작업을 잃기 쉽습니다.

정기 Agent원격 Mac M4 호스팅 노드에 두는 것은 실질적으로 세 가지를 확보하는 것입니다: ① 7×24 온라인과 제어 가능한 재시작; ② LLM/MCP API에 대한 낮은 RTT(아태 또는 미동 선택); ③ 일/주/월 임대 탄력성——PoC 실패 시 해제 가능, 실험용 물리기 구매 불필요.

본문의 주축은 「정기/이벤트 트리거 + MCP 오케스트레이션」이며 git worktree 팜(별도 기사)이 아닙니다. OpenClaw 게이트웨이, 18789 콜드 스타트, Tunnel+MCP는 경계 절에서만 대조하며 본문에서 반복하지 않습니다.

2. SSH 개통과 launchd/crnd 환경: 30분 검수 체크리스트

원격 Mac M4 개통 후 첫 LaunchAgent를 로드하기 전 30분 이내에 다음을 완료하는 것을 권장합니다. SSH 접속 상세는고객센터를 참고하세요.

  1. 키 SSH 로그인, uname -m이 arm64, 타임존·NTP 정상.
  2. Homebrew, Node 22(Agent CLI 상용), 트러블슈팅용 tmux 또는 screen 설치.
  3. 디렉터리 생성: ~/agent-runs/state, ~/agent-runs/logs, ~/agent-runs/scripts.
  4. API Key를 ~/.config/agent/env에 기록(권한 600). LaunchAgent는 EnvironmentVariables로 주입하고 plist에 직접 쓰지 않음.
  5. 수동으로 crnd schedule 또는 launchd 테스트 작업 1건 실행, 로그가 디스크에 남는지 확인.
  6. 머신에서 curl로 LLM/MCP 엔드포인트 도달·RTT 기록. Webhook 콜백은 방화벽·인바운드 정책 확인.

모두 통과한 뒤 PoC 임대 기간을 결정하세요. 하나라도 실패하면 주/월 임대로 올리지 마세요.

3. launchd LaunchAgent 토폴로지

macOS에서 사용자 수준 정기 작업은 ~/Library/LaunchAgents/에 두고 launchctl bootstrap gui/$(id -u)로 로드합니다(Ventura 이후는 구식 load보다 bootstrap 권장).

모드적용 시나리오장점주의점
launchd 직접 스크립트고정 간격/캘린더, 단일 저장소 배치의존성 없음, OS 네이티브, 로그 명확plist에 ThrottleInterval 수동 작성
crnd / agent-reveille다중 Agent, 자연어 스케줄CLI 친화, 버전 관리 용이하층은 launchd/cron 의존
n8n + MCP Webhook크로스 시스템 오케스트레이션, 승인 노드Curated tools, 재시도·알림1홉 지연, 인바운드 보안 필요

전형적인 LaunchAgent 필드:

  • StartCalendarInterval:일/시/분 트리거, cron 대체.
  • KeepAlive:프로세스 종료 후 재시작. ThrottleInterval과 병용해 크래시 루프 방지.
  • StandardOutPath / StandardErrorPath:로그 필수. 미설정 시 트러블슈팅은 추측뿐.
LaunchAgent 예(30분마다 Codex 배치)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"><dict>
  <key>Label</key><string>com.kvmboot.agent.codex-batch</string>
  <key>ProgramArguments</key><array>
    <string>/bin/zsh</string><string>-lc</string>
    <string>source ~/.config/agent/env && ~/agent-runs/scripts/run-codex-batch.sh</string>
  </array>
  <key>StartCalendarInterval</key><dict>
    <key>Minute</key><integer>0</integer><key>Hour</key><integer>*/1</integer>
  </dict>
  <key>ThrottleInterval</key><integer>300</integer>
  <key>StandardOutPath</key><string>/Users/runner/agent-runs/logs/codex.out.log</string>
  <key>StandardErrorPath</key><string>/Users/runner/agent-runs/logs/codex.err.log</string>
</dict></plist>

로드: launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.kvmboot.agent.codex-batch.plist. 언로드는 동일 경로로 bootout.

4. MCP / n8n Webhook 트리거 체인과 Curated tools

MCP 트리거의 전형 경로는 두 가지: Agent CLI가 MCP Server에 직접 연결(인트라 또는 SSH 터널 내), 또는 n8n/Cursor Automations가 Webhook으로 원격 Runner 스크립트 호출(승인·재시도·알림이 필요한 플로).

보안 경계 권장:

  • Curated tools만(화이트리스트 파일 읽기/쓰기, 고정 API). shell MCP를 무제한으로 인터넷 공개하지 않음.
  • Webhook 인바운드는 HMAC / 단기 token 검증. 멱등 키를 state/runs에 기록해 이중 트리거 방지.
  • 타임아웃·재시도: LLM 호출에 hard timeout. 실패는 지수 백오프. launchd와 Webhook 이중 트리거 폭주 방지.

2026년 Mattermost + n8n + MCP 사례는 오케스트레이션층이 n8n, 실행층이 macOS Runner임을 보여줍니다——본문의 launchd 직접 호출과 공존 가능. 팀이 이미 n8n을 쓰는지에 따라 선택.

5. Claude Code / Codex CLI 정기 작업 템플릿

Claude CodeCodex CLI는 비대화 모드 배치 실행 가능. 핵심은 AGENTS.md, 작업 디렉터리, env 주입을 launchd 환경과 수동 SSH에서 동일하게 맞추는 것.

run-codex-batch.sh(개요)
#!/bin/zsh
set -euo pipefail
cd ~/projects/my-repo
export CODEX_API_KEY="$(grep CODEX_API_KEY ~/.config/agent/env | cut -d= -f2-)"
/usr/local/bin/codex exec --prompt-file ~/agent-runs/prompts/nightly-review.md \
  >> ~/agent-runs/logs/codex-$(date +%Y%m%d).log 2>&1

agent-reveille / crnd 사용 시: reveille add "0 9 * * 1-5" -- codex exec ...로 스케줄을 빠르게 시험하고, 안정 후 plist를 내보내 IaC에 포함.

worktree 병렬 Agent와 조합할 때: 정기 작업은 「머지/Review」류 배치, 대화형 코딩은 worktree 분리——단일 디렉터리 락 경합 회피.

6. 로그, 비밀키, 스토리지 계획

Agent 장기 운영 후 state/runs, 모델 캐시, npm/pnpm store가 디스크를 빠르게 점유합니다. 경험치(SLA 아님): 경량 문안 Agent는 512 GB로 수주; 로컬 Ollama·대량 artifact 시 512 GB는 2–4주 내 압박 가능.

  • 로그 로테이션: log rotate 또는 일별 분할. 단일 파일이 inode를 압박하지 않게.
  • 비밀키는 Keychain 또는 600 권한 env만. LaunchAgent ProgramArguments에 token 평문 금지.
  • 디스크 80% 알림 시 runs 캐시 우선 삭제, 부족하면 용량 확장 또는2번째 병렬 Runner 검토.

메모리: 순수 API 호출형 Agent는 16 GB로 보통 충분. 동일 머신에서 Ollama 7B+·Claude Code 병렬 시 swap과메모리 피크 거버넌스 주의. 필요 시 24 GB 또는 머신 분리.

7. 작업 빈도 × 임대 기간: 의사결정 매트릭스와 이전 체크표

작업 특성스토리지 압력권장 임대이전 조건
매시간 경량 MCP낮음(<5 GB/주)일 임대 PoC → 월 임대7일 연속 실패 없음, 로그 감사 가능
매일 Codex 전체 저장소 Review중(10–30 GB/주)주 임대 → 월 임대디스크 <70%, RTT 안정
다중 Agent + 로컬 모델높음(>50 GB/주)주 임대 + 512GB→1TB2번째 병렬 검토

가격은요금제 페이지와 콘솔을 기준으로 합니다. 권장 순서: 일 임대 PoC(1–3일, launchd + MCP 첫 작업 통과) → 주 임대로 이터레이션 스프린트 고정 → 2주 연속 지표 안정 후 월 임대 상주. PoC 체크리스트:

  1. LaunchAgent 로드 성공, 재부팅 후에도 자동 기동.
  2. Webhook/MCP 엔드투엔드 성공 1회 이상, state에 멱등 기록.
  3. 24h 로그에 미포착 panic 없음. 디스크/inode 증분 허용 범위.
  4. API RTT·에러율이 팀 임계값 내(미동/아태는 workload별 노드 선택).

8. OpenClaw Gateway와의 경계(대조)

OpenClaw는 메시지형 게이트웨이에 강합니다: 18789 대외, Tunnel+Webhook, 다채널 인바운드. 본문의 정기 Agent는 배치 CLI: launchd 트리거, 상주 HTTP 포트 없음, cron형 작업용. 동일 원격 Mac M4에 공존 가능하나 계정/디렉터리로 분리. 게이트웨이 배포는 OpenClaw 칼럼 참고, 본문에서는 펼치지 않습니다.

9. 트러블슈팅 FAQ

plist 로드 실패? plutil -lint로 XML 검증. Label 고유성 확인. Ventura+는 load가 아닌 bootstrap.

launchctl bootstrap I/O error? 먼저 동일 job bootout. plist가 LaunchAgents에 있고 경로 공백 문제 없는지 확인.

작업은 도는데 로그 없음? StandardOutPath 부모 디렉터리 존재·실행 사용자 쓰기 권한 확인.

KeepAlive가 과도하게 재시작? ThrottleInterval 증가. 스크립트 set -e 전 trap. 즉시 종료 스크립트 의심.

Seatbelt / Keychain이 CLI 차단? 최초 대화형 SSH에서 Keychain 승인. LaunchAgent 환경에 로그인 shell과 동일 PATH·HOME 필요.

MCP 타임아웃? tools 수 제한, timeout 상향, Runner를 API 가까운 리전으로 이동.

Webhook 이중 트리거? 멱등 키를 state/runs에. n8n 측 dedupe.

Ollama 로컬 추론 OOM? 더 작은 모델, 동시성 제한, 메모리 플랜 업/2번째 Runner.

언제 2번째 병렬? 단일 디스크 80%+에서 정리 무효, 또는 CPU 장시간 >85%이고 작업 shard 가능할 때.

일 임대 PoC 최소 기간? 24h 정기 주기 + 수동 Webhook 트리거 1회 커버.

worktree 병렬 기사와 분담? 본문은 「언제 돌릴지」; worktree 기사는 「어디서·어떻게 병렬 코딩할지」.

OpenClaw vs launchd? 메시지/게이트웨이는 OpenClaw; cron/배치는 launchd. FAQ 톤: SLA 약속 없음, PoC 실측 기준.

클라우드 Mac mini에서 안정적인 정기 Agent

M4 전용, 낮은 대기 전력, macOS 네이티브 launchd는 Windows 작업 스케줄러나 Linux cron보다 Claude Code / Codex CLI 체인에 잘 맞습니다. 아태/미동 노드 선택, SSH 즉시 사용, 7×24 무인 운영은 로컬 Mac 뚜껑 개폐에 의존하지 않습니다. 위 PoC 체크리스트 통과 후 임대 기간을 확정하면 자체 워크스테이션+전기+운영 인력보다 종합 비용이 낮아지기 쉽습니다.

먼저 일 임대로 대상 리전에서 launchd + 첫 MCP 트리거 작업을 검수—— 임대 플랜 비교, 메모리·스토리지 확인, SSH 접속 안내, 또는 에서 주문 전 자가 점검. 더 많은 실전 글은 블로그에서.